(outofmemoryerror:java堆空间)在遍历oracle记录时

(outofmemoryerror:java堆空间)在遍历oracle记录时,java,oracle,Java,Oracle,各位java开发人员好 我这里有点问题。我的代码从oracle数据库中获取结果集,将每一行打印到一个文件中,然后获取下一行,并一直持续到结果集的末尾 只是事情不是这样的。发生的情况是,它获取结果集,开始遍历行,并在运行时打印到文件,直到内存耗尽——声称它需要java堆上更多的空间 该应用程序当前运行时堆上有2g内存,代码在第150000行左右中断 我正在使用jodbc6.jar和Java6 下面是我的代码的一个想法: Connection conn = DriverManager.getConn

各位java开发人员好

我这里有点问题。我的代码从oracle数据库中获取结果集,将每一行打印到一个文件中,然后获取下一行,并一直持续到结果集的末尾

只是事情不是这样的。发生的情况是,它获取结果集,开始遍历行,并在运行时打印到文件,直到内存耗尽——声称它需要java堆上更多的空间

该应用程序当前运行时堆上有2g内存,代码在第150000行左右中断

我正在使用jodbc6.jar和Java6

下面是我的代码的一个想法:

Connection conn = DriverManager.getConnection(url,"name","pwd");

conn.setAutoCommit(false);
Statement stmt = conn.createStatement();
ResultSet rset = stmt.executeQuery(strSql);

String strVar_1 = null;

long lCount = 0;
while(rset.next()){
        lCount++;
        if (lCount % 100000 == 0){
            System.out.println(lCount + " rows completed");
        }
      strVar_1 = rset.getString("StringID");  /// breaks here!!!!!!!!!

      if (strVar_1 == null){
        strVar_1 = "";
      }         
      if (!strQuery_1.equals("")){
        out.write(strVar_1 + "\n");
      }
 }
 out.close();
请尝试以下内容:

Statement stmt = conn.createStatement();
stmt.setFetchSize(someInt);
ResultSet rset = stmt.executeQuery(strSql);

这将控制一次提取多少条记录。

处理如此大数据的另一种方法可能是不断返回行并将其写入文件。通过这种方式,字符串缓冲区不会持续增长,您应该能够将所有记录写入文件系统,然后延迟读取它们

Ok,将尝试并报告回来(查询需要一段时间才能从网络返回记录)Thank我认为您的查询返回了大量行。作为旁注,您还应该调用ResultSet、语句和连接的close。我认为它可以工作,只是有点奇怪。。。结果是,当我的计数写入屏幕时,下降到x00000。所有计数都已清除,并从100000开始重新开始。非常奇怪的行为。。。这就像是一次又一次地运行这个过程。我需要在while子句中添加任何特殊内容吗?比如,getnextfetchset之类的?不,它应该是透明的。您实际的SQL查询是什么样子的?谢谢-我来做。写(strVar_1+“\n”);我正在将数据写入文件。