当前位置:编程学习 > JAVA >>

java 从数据库中导出大量数据 生成txt文件,内存溢出

String sql = "SELECT PHONE_NO PHONE_NO,USER_ID USER_ID FROM "+ tableName ;
 try { 
     dbaction.getConn(); 
         Statement stmt = dbaction.con.createStatement();     
      ResultSet rs = stmt.executeQuery(sql);
while (rs.next()){                      

    String userIdExt = userId.substring(userId.length()-2, userId.length());
     smallFileName = time + "_"+userIdExt+".txt";

    writerSml = new BufferedWriter(new FileWriter(smallFileName,true));
           writerSml.write(phoneNo+"|"+userId+"\r\n");
           writerSml.flush();
       
           writer.close();  
           writerSml.close();       
 
             }
1、需求:从数据库中读取百万级的记录,(包括用户手机号、用户id)取出后按照userid后两位分(00-99)生成100不同的txt文件。
2、以上是代码,程序运行一段时间后,当取数过多的时候导致系统内存溢出,
 
  问题: 1、怎么优化下代码能够减少系统内存的使用。
        2、怎么优化下代码提高系统的效率。 
java io java文件生成 java内存溢出 --------------------编程问答-------------------- 你这数据太多了!全部塞到内存中不爆才怪啊。
查询一次不要太多,查一次写一次文件。分多次查询。文件尽量满多少M分割文件 --------------------编程问答-------------------- 分批次的查询吧。。不然内存。。难以满足你 --------------------编程问答-------------------- 多次查询吧。一次太多了 --------------------编程问答-------------------- 分批查  --------------------编程问答-------------------- 太多了...分批次吧 --------------------编程问答-------------------- 你是要按userid的后两位写文件的,所以写个循环,分批次查询就好了啊。
如果还是不行,就用rownum。 --------------------编程问答-------------------- 你确定你的内存是在这段代码里溢出的么?jdbc的resultset和你的操作都是流操作,正常情况下应该是不会有大量内存占用的,去分析一下你溢出的内存的占用情况吧 --------------------编程问答-------------------- 我刚搞了跟你差不多功能的问题,主要是你没有分页去处理,将sql语句分页处理,每10000条或者20000条记录查询一次(这个得根据你写入文件的字符串的长度,如果记录太多字符串有可能超出最大长度,你这里我觉得每次执行100000条记录都没问题),然后写入到文件中再进行下一次操作,就不会出现内存溢出的问题了 --------------------编程问答-------------------- Opening --------------------编程问答-------------------- 分批次查询试试 --------------------编程问答-------------------- 每次循环就执行writerSml.write(phoneNo+"|"+userId+"\r\n");由于数据量太大,导致内存溢出,建议分批次查询导出。
--------------------编程问答-------------------- 写个定时器,每次导出若干条,修改状态位 --------------------编程问答-------------------- 读1000条写1000条。

做定时器,化整为零。 --------------------编程问答-------------------- 你的statement没释放,当然内存会溢出……
这种文件见过好多了

String sql = "SELECT PHONE_NO PHONE_NO,USER_ID USER_ID FROM "+ tableName ;
Statement stmt = null;
 try { 
     dbaction.getConn(); 
         stmt = dbaction.con.createStatement();     
      ResultSet rs = stmt.executeQuery(sql);
while (rs.next()){                 
.....
}
catch(Exception e) {
}
finally {
   if (stmt != null){
     stmt.close();
   }
  // connection,也要在这里释放,如果是连接池的,则是还回池中.
//  其实所有的文件读写的close,都是最好放在finally 块中。
} --------------------编程问答--------------------
引用 1 楼 huxiweng 的回复:
你这数据太多了!全部塞到内存中不爆才怪啊。
查询一次不要太多,查一次写一次文件。分多次查询。文件尽量满多少M分割文件

同意 --------------------编程问答--------------------
引用 14 楼 darkwing 的回复:
你的statement没释放,当然内存会溢出……
这种文件见过好多了

String sql = "SELECT PHONE_NO PHONE_NO,USER_ID USER_ID FROM "+ tableName ;
Statement stmt = null;
 try { 
     dbaction.getConn(); 
         stmt = dbaction.con.createStatement();     
      ResultSet rs = stmt.executeQuery(sql);
while (rs.next()){                 
.....
}
catch(Exception e) {
}
finally {
   if (stmt != null){
     stmt.close();
   }
  // connection,也要在这里释放,如果是连接池的,则是还回池中.
//  其实所有的文件读写的close,都是最好放在finally 块中。
}


同意,这个问题应该是连接没有关闭导致的内存溢出,跟写入根本没有关系。

查询和写入都是流操作,不是导致内存溢出 --------------------编程问答-------------------- 这种问题在一开始,就应根据你的数据量的来考虑查询方式了,同时使用分批次跟分页,不管什么样的东东,单个文件太大肯定会导致系统慢耜用内存多,可用内存截越小,数据处理就更慢,最终肯定就是内存溢出了. --------------------编程问答-------------------- 这个吧,你从数据库那就得先处理。

1、需求:从数据库中读取百万级的记录,(包括用户手机号、用户id)取出后按照userid后两位分(00-99)生成100不同的txt文件。

----------------------
先截取userid后两位 然后分组并统计一下。 看看每组有多少计录,然后再一批一批的取。
补充:Java ,  Java EE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,