java导出大量数据,出现错误

java导出大量数据,出现错误,第1张

这种异常一般是由于调用Method类的invoke()方法,该方法所代表的指定方法抛出异常时,或者调用Constructor类的newInstance()方法,该方法所代表的底层构造方法抛出异常时,由javalangreflectInvocationTargetExceptio异常包装后作为新的异常抛出而产生,默认异常信息是NULL。

因此,有可能是由于数据问题导致以反射的方式调用的方法(即:Method类代表的方法)在运行时抛出了异常,被封装成InvocationTargetExceptio异常抛到后台。所以可以去检查一下这个以反射的方式调用的方法,在调用到了什么数据的时候抛出了异常。

比如想将一个1000W数据的数据库表,导出到文件;此时,你要么进行分页,oracle当然用三层包装即可,mysql用limit,不过分页每次都会新的查询,而且随着翻页,会越来越慢,其实我们想拿到一个句柄,然后向下游动,编译一部分数据(如10000行)将写文件一次(写文件细节不多说了,这个是最基本的),需要注意的时候每次buffer的数据,在用outputstream写入的时候,最好flush一下,将缓冲区清空下;接下来,执行一个没有where条件的SQL,会不会将内存撑爆?是的,这个问题我们值得去思考下,通过API发现可以对SQL进行一些 *** 作,例如,通过:PreparedStatement statement = connectionprepareStatement(sql),这是默认得到的预编译,还可以通过设置:PreparedStatement statement = connectionprepareStatement(sql , ResultSetTYPE_FORWARD_ONLY , ResultSetCONCUR_READ_ONLY);

来设置游标的方式,以至于游标不是将数据直接cache到本地内存,然后通过设置statementsetFetchSize(200);设置游标每次遍历的大小;OK,这个其实我用过,oracle用了和没用没区别,因为oracle的jdbc API默认就是不会将数据cache到java的内存中的,而mysql里头设置根本无效,我上面说了一堆废话,呵呵,我只是想说,java提供的标准API也未必有效,很多时候要看厂商的实现机制,还有这个设置是很多网上说有效的,但是这纯属抄袭;对于oracle上面说了不用关心,他本身就不是cache到内存,所以java内存不会导致什么问题,如果是mysql,首先必须使用5以上的版本,然后在连接参数上加上useCursorFetch=true这个参数,至于游标大小可以通过连接参数上加上:defaultFetchSize=1000来设置,例如:

jdbc:mysql://xxxxxxxxxxxx:3306/abczeroDateTimeBehavior=convertToNull&useCursorFetch=true&defaultFetchSize=1000

上次被这个问题纠结了很久(mysql的数据老导致程序内存膨胀,并行2个直接系统就宕了),还去看了很多源码才发现奇迹竟然在这里,最后经过mysql文档的确认,然后进行测试,并行多个,而且数据量都是500W以上的,都不会导致内存膨胀,GC一切正常,这个问题终于完结了。

对mysql不是很了解,但比较大的数据库都是不可以的,不过mysql似乎有过内嵌到一些软件或平台中的情况

我可以回答LZ的补充问题,杀毒软件用的不是传统上的关系型数据库,它们所谓的数据库其实只是一个或几个特殊的文件而已,这些文件存在你的安装目录下,就好像记事本一样,打开文件,把文件拿出来对比,就这样,还有典型的比如网游和咱们的 *** 作系统也是这样

import javasql;

import javaawt;

import javaxswing;

import javaxswingtable;

//import javaawtevent;

public class DisplayDemo extends JFrame

//implements ActionListener

{

// private String dbURL="jdbc:microsoft:sqlserver://20211526181:1433"; // 数据库标识名

private String user="devon"; // 数据库用户

private String password="book"; // 数据库用户密码

private JTable table;

private JButton ok,canel;

public DisplayDemo(){

super("显示数据库查询结果"); //调用父类构造函数

String[] columnNames={"用户名","年龄","性别","Email"}; //列名

Object[][] rowData=new Object[5][4]; //表格数据

ok=new JButton("确定");

canel=new JButton("取消");

// okaddActionListener(this);

// caneladdActionListener(this);

try {

ClassforName("sunjdbcodbcJdbcOdbcDriver");

Connection con=DriverManagergetConnection("jdbc:odbc:example","sa","");

// ClassforName("commicrosoftjdbcsqlserverSQLServerDriver"); //加载驱动器

// Connection con=DriverManagergetConnection(dbURL,user,password); //获取连接

String sqlStr="select from users"; //查询语句

PreparedStatement ps=conprepareStatement(sqlStr); //获取PreparedStatement对象

ResultSet rs=psexecuteQuery(); //执行查询

String name,sex,email; //查询结果

int age;

int count=0;

while (rsnext()){ //遍历查询结果

rowData[count][0]=rsgetString("name"); //初始化数组内容

rowData[count][1]=IntegertoString(rsgetInt("age"));

rowData[count][2]=rsgetString("sex");

rowData[count][3]=rsgetString("email");

count++;

}

conclose(); //关闭连接

}

catch(Exception ex){

exprintStackTrace(); //输出出错信息

}

Container container=getContentPane(); //获取窗口容器

//containersetLayout(null);

containeradd(ok);containeradd(canel); oksetBounds(10,120,70,20);

canelsetBounds(100,120,70,20);

table=new JTable(rowData,columnNames); //实例化表格

tablegetColumn("年龄")setMaxWidth(25); //设置行宽

containeradd(new JScrollPane(table),BorderLayoutCENTER); //增加组件

setSize(300,200); //设置窗口尺寸

setVisible(true); //设置窗口可视

setDefaultCloseOperation(JFrameEXIT_ON_CLOSE); //关闭窗口时退出程序

}

public static void main(String[] args){

new DisplayDemo();

}

}

-----------------

这是其中一个例子 你照着上面做就可以了

以上就是关于java导出大量数据,出现错误全部的内容,包括:java导出大量数据,出现错误、你好,java 向数据库添加大量数据时内存溢出 在不改变内存的情况下如何解决 你当时是怎么解决的、java有关数据库的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10155376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存