1

我正在使用 JDBC 来获取大量数据。调用成功完成,但调用时resultSet.next()出现以下错误:

java.lang.OutOfMemoryError: allocLargeObjectOrArray - Object size: 15414016, Num elements: 7706998

我试图增加 JVM 内存大小,但这并不能解决问题。我不确定这个问题是否可以解决,因为我没有使用 JDBC 访问数据库,而是系统通过 JDBC 访问 BEA AquaLogic 服务。

有没有人遇到这个错误?

4

5 回答 5

1

请注意,在第一次调用 resultSet.next() 之前,结果可能尚未从数据库中读取,或者仍位于某个地方的另一个缓存结构中。

您应该尝试限制您的 Select 以返回合理数量的结果,并且如果您需要所有数据,则可以重复调用直到没有更多结果。

除非您可以确定 JDBC 调用将返回的数据量存在绝对限制,否则增加 JVM 内存大小将无济于事。

此外,通过 JDBC 访问任何服务本质上归结为使用 JDBC :)

另一种(不太可能)可能是您正在使用的 JDBC 驱动程序中存在错误。如果可能,请尝试不同的实现,并检查问题是否仍然存在。

于 2009-06-02T17:36:45.500 回答
1

首先——弄清楚你是否真的需要一次在内存中获取那么多数据。RDBMS 擅长聚合/排序/等大型数据集,如果可能,您应该尝试利用这一点。

如果不是(并且由于某种原因,您确实确实需要工作内存中的那么多数据)...并且提高 JVM 的内存参数并不能提高标准...查看内存中分布式缓存解决方案,例如Coherence (COTS) 或 TerraCotta(开源)。

于 2009-11-04T04:10:33.953 回答
0

您可以尝试在语句中设置 setFetchSize(int rows) 方法。
但是 setFetchRows 只是一个提示,这意味着它可能不会被实现。

于 2009-06-16T20:55:04.010 回答
0

尝试将内存大小增加到 1.2g,例如 -mx1200m 或比您机器的物理内存小一些。您可能会发现它一次读取的数据比您想象的要多。

于 2009-06-16T21:05:24.520 回答
0

您从数据库返回多少行?像 kosi2801 我建议只获取数据的一个子集,从一个合理的数字开始,然后增加以找到阈值。

于 2009-11-06T10:40:27.723 回答