【问题标题】:(outofmemoryerror: java heap space) when iterating through oracle records(outofmemoryerror: java heap space) 遍历oracle记录时
【发布时间】:2010-03-16 03:22:11
【问题描述】:

你好 Java 开发人员。

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

只有这不是发生的事情。发生的情况是它获取结果集,开始遍历行,在运行过程中打印到文件,直到内存不足 - 声称它需要 Java 堆上的更多空间。

应用程序当前在堆上使用 2g 内存运行,代码在大约第 150000 行处中断。

我正在使用 jodbc6.jar 和 java 6

这是我的代码在做什么的一个想法:

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();

【问题讨论】:

    标签: java oracle


    【解决方案1】:

    试试下面:

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

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

    【讨论】:

    • 好的,试一试并反馈(查询需要一段时间才能通过网络返回记录)谢谢
    • 我认为您的查询返回了大量的行。顺便说一句,您还应该在 ResultSet、Statement 和 Connection 上调用 close。
    • 我认为它可以工作,只是有点奇怪......结果是当我的计数被写入屏幕时,它会下降到 X00,000。所有的计数都清除了,从 100,000 开始重新开始。非常奇怪的行为......就像它一遍又一遍地运行这个过程。我需要在我的 while 子句中添加什么特别的东西吗?比如,getnextfetchset 什么的?
    • 不,应该是透明的。
    • 您的实际 SQL 查询是什么样的?
    【解决方案2】:

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

    【讨论】:

    • 谢谢 - 我做了 out.write(strVar_1 + "\n");我是在将数据写入文件吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2017-03-28
    • 2012-11-11
    相关资源
    最近更新 更多