在Hibernate中使用Criteria.scroll()的Postgresql OutOfMemory,带有2M记录

时间:2009-12-22 04:06:43

标签: hibernate postgresql scroll out-of-memory

我在包含2M的数据库上运行PostgreSQL上的Criteria.scroll() 记录。内存不断增加,最终产生了一个 OutOfMemoryException异常。请问您如何解决这个问题。

  

Postgresql DB版本:8.4   使用Postgresql驱动程序:postgresql-8.4-701.jdbc4.jar

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

感谢任何指导/建议。

4 个答案:

答案 0 :(得分:3)

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

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

您可能只希望每循环100次左右清除会话。我会用几种不同的方式来看看什么是最好的。

答案 1 :(得分:0)

我将根据您编写名称的方式猜测它是一个Java OutOfMemoryException。

希望这不是显而易见的哈哈,但是当你执行你的Criteria.scroll()时你得到一个ScrollableResults,并且我假设你正在对它进行处理。你是否将每个项目加载到内存中?

或者您是否因为获取ScrollableResults而收到此错误?我会发现这很奇怪。

答案 2 :(得分:0)

如果这很大,您需要在查询中添加setFetchSize(XXX)

答案 3 :(得分:-2)

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