Hibernate中带条件的Postgresql OutOfMemory.scroll()具有2M条记录

Hibernate中带条件的Postgresql OutOfMemory.scroll()具有2M条记录,hibernate,postgresql,scroll,out-of-memory,Hibernate,Postgresql,Scroll,Out Of Memory,我正在一个包含2M的数据库上运行PostgreSQL上的Criteria.scroll() 记录。内存不断增加,最后生成一个 OutOfMemoryException。请你告诉我如何解决这个问题 Postgresql数据库版本:8.4 使用的Postgresql驱动程序:Postgresql-8.4-701.jdbc4.jar PostgreSQL中的Hibernate scroll()是否存在已知问题 感谢您的指导/建议。根据您编写名称的方式,我猜这是一个Java OutOfMemoryExc

我正在一个包含2M的数据库上运行PostgreSQL上的Criteria.scroll() 记录。内存不断增加,最后生成一个 OutOfMemoryException。请你告诉我如何解决这个问题

Postgresql数据库版本:8.4 使用的Postgresql驱动程序:Postgresql-8.4-701.jdbc4.jar

PostgreSQL中的Hibernate scroll()是否存在已知问题


感谢您的指导/建议。

根据您编写名称的方式,我猜这是一个Java OutOfMemoryException

希望这不是很明显,哈哈,但是当你执行你的条件时,你会得到一个可滚动的结果。scroll()我假设你正在处理这些数据。您是否正在将每个项目加载到内存中

还是仅仅通过获取ScrollableResults就得到了这个错误?我会觉得很奇怪

您必须时不时地调用System.gc()(例如,每处理1000条记录)。
或者,不要一次拿那么多东西;使用setMaxResults(int)和setFirstResult(int)方法获取较小的数据子集。例如,一次记录10K条,然后是System.gc(),然后是下一批,等等。

您需要定期调用
session.clear()
,以从Hibernate会话中清除对象。例如:

while(results.next()) {
  processResults(results);
  getSession().clear();
}

您可能只希望在循环的大约100次迭代中清除会话。我会用几种不同的方法计时,看看什么是最好的。

如果这太大了,您需要在查询中添加客户机进程或服务器中的内存。您永远不应该调用垃圾收集器。这样做甚至不能保证它会运行——这是对JVM的建议。更不用说默认的垃圾收集器在运行时会冻结整个应用程序。当它认为最好的时候就让它跑。最后,在这种情况下,它不会有任何帮助-Hibernate会话保留对象。