Java堆空间异常,处理大量数据时出现,有解决方法吗?

3
我有一个关于Java堆内存的问题。我正在尝试从Oracle数据库11g迁移到Access文件2007。
在记录数低于65,000条时,这不是问题。但在那之后,应用程序会抛出Java堆异常,内存消耗超过600m,CPU使用率超过50%,直到发生异常。
据我所知,rset.next()不会获取所有数据(超过50列x +65000行),而只会获取一些记录x次。我已经尝试设置fetch size,但没有任何效果。
rset.setFetchSize(1000);

我已经删除了代码并显示输出,但仍然出现相同的错误。
while (rset.next()) {
 if (cont % 5000 == 0) {
     System.out.println(cont + " proccesed and counting ...");
 }
}

请不要给我使用“-xm(s, x)512、1024等”作为答案...... 虽然这可以解决问题,但在我的情况下没有用(我甚至尝试过将其设置得更高,xD,仍然无效,在65000个记录时也会出现相同的异常)。
还有其他选项可以尝试吗?也许可以更改一些驱动程序配置或连接字符串吗? 请帮忙。
抱歉我的英语不好。
这是我的连接:
Class.forName("oracle.jdbc.driver.OracleDriver");
this.conn = DriverManager.getConnection("jdbc:oracle:thin:@" + getServer() + ":1521:orcl", getUser(), getPassword());
                this.stmt = this.conn.createStatement(java.sql.ResultSet.TYPE_SCROLL_INSENSITIVE, java.sql.ResultSet.CONCUR_UPDATABLE);

2
你能让我们看到你的错误信息吗? - OscarRyz
这个问题上为什么有MS-ACCESS标签?我在里面看不到任何关于Access或Jet/ACE数据库引擎的内容。 - David-W-Fenton
是的,我删除了这个问题的代码,只做了Oracle查询,让您知道这不是连接问题。 - ErVeY
你有没有办法分割结果集,以便不必一次性返回太多记录? - Victor Parmar
是的,我也这么想,但也许我会创建一个临时表来实现这一点。我需要一键生成 MSAccess 数据库供客户下载。但是要如何做到呢?谢谢所有的回答。 - ErVeY
你在评论中提到了Access,但我在你的实际问题中仍然没有看到任何关于Access的内容。 - David-W-Fenton
1个回答

2

看起来问题在于您正在使用可滚动的ResultSet,这会使用更多的内存。


3
如果您需要逐行处理结果集,请使用TYPE_FORWARD_ONLY而不是TYPE_SCROLL_INSENSITIVE。我认为TYPE_SCROLL_INSENSITIVE的实现是在检索时缓存行,导致内存溢出(由于所有Oracle游标在数据库端都是仅向前的,因此客户端必须通过客户端缓存实现可滚动功能)。 - Vincent Malgrat
谢谢Vincent,我会尝试的。自从我开始做这个问题以来,我就与世隔绝了,所以我无法关注那些讨论串,对此感到抱歉。 - ErVeY
我已切换到type_forward_only,目前一切正常,感谢Vincent和JZD的答案 =D。 - ErVeY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接