我在包含 2M 记录的数据库上的 PostgreSQL 上运行 Criteria.scroll()。内存不断增加,最后会产生 OutOfMemoryException。请你能建议如何解决这个问题。
Postgresql DB 版本:8.4 使用的 Postgresql 驱动程序:postgresql-8.4-701.jdbc4.jar
PostgreSQL 中的 Hibernate scroll() 是否存在一些已知问题?
感谢任何指导/建议。
我在包含 2M 记录的数据库上的 PostgreSQL 上运行 Criteria.scroll()。内存不断增加,最后会产生 OutOfMemoryException。请你能建议如何解决这个问题。
Postgresql DB 版本:8.4 使用的 Postgresql 驱动程序:postgresql-8.4-701.jdbc4.jar
PostgreSQL 中的 Hibernate scroll() 是否存在一些已知问题?
感谢任何指导/建议。
您需要session.clear()
定期调用以从 Hibernate 会话中清除对象。例如:
while(results.next()) {
processResults(results);
getSession().clear();
}
您可能只想在循环的每 100 次左右迭代中清除一次会话。我会用几种不同的方式来看看什么是最好的。
I am going to guess that it is a Java OutOfMemoryException based on the way you wrote the name.
Hope this isn't to obvious haha, but you get a ScrollableResults when you do your Criteria.scroll() and I assume you are doing something with that data as you go through it. Are you loading each item into memory?
Or are you getting this error just by getting the ScrollableResults? I would find that odd.
如果这很大,您需要在查询中添加setFetchSize(XXX)
您必须不时调用 System.gc() (例如,您处理的每 1000 条记录)。或者,不要一次获取这么多对象;使用 setMaxResults(int) 和 setFirstResult(int) 方法来获取较小的数据子集。例如一次 10K 条记录,然后是 System.gc(),然后是下一批,等等。