我在包含2M的数据库上运行PostgreSQL上的Criteria.scroll() 记录。内存不断增加,最终产生了一个 OutOfMemoryException异常。请问您如何解决这个问题。
Postgresql DB版本:8.4 使用Postgresql驱动程序:postgresql-8.4-701.jdbc4.jar
PostgreSQL中的Hibernate scroll()是否存在一些已知问题?
感谢任何指导/建议。
答案 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(),然后是下一批等,