我正在使用JDBC来获取大量数据。调用成功完成,但调用resultSet.next()
时,出现以下错误:
java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 15414016, Num elements: 7706998
我试图增加JVM内存大小,但这并不能解决问题。我不确定这个问题是否可以解决,因为我没有使用JDBC访问数据库,而是系统通过JDBC访问BEA AquaLogic服务。
是否有人遇到此错误?
答案 0 :(得分:1)
请注意,在第一次调用resultSet.next()之前,结果可能尚未从数据库中读取,或者仍然位于某个地方的另一个缓存结构中。
您应该尝试限制您的选择以返回一定数量的结果,并且可能会重复通话,直到您需要所有数据时不再有结果。
增加JVM内存大小将无济于事,除非您可以确定JDBC调用将返回的数据量存在绝对限制。
此外,通过JDBC访问任何服务实质上归结为使用JDBC:)
另一种(不太可能的)可能是您正在使用的JDBC驱动程序中存在错误。如果可能的话尝试不同的实现,并检查问题是否仍然存在。
答案 1 :(得分:1)
首先 - 弄清楚你是否真的需要一次在内存中获取那么多数据。 RDBMS擅长聚合/排序/等大数据集,如果可能的话,你应该尝试利用它。
如果没有(并且你真的,由于某种原因确实需要工作内存中的那么多数据)...并且提高JVM的内存args并没有提高足够的标准...查看内存分布缓存解决方案,如Coherence(COTS)或TerraCotta(开源)。
答案 2 :(得分:0)
您可以尝试在语句中设置setFetchSize(int rows)方法 但是setFetchRows只是一个提示,这意味着它可能无法实现。
答案 3 :(得分:0)
尝试将内存大小增加到1.2g,例如-mx1200m或者小于机器物理内存的东西。您可能会发现它一次读取的数据比您想象的要多。
答案 4 :(得分:0)
您从数据库返回了多少行?像kosi2801我建议只获取数据的一个子集,从一个合理的数字开始,然后增加以找到阈值。