【问题标题】:Postgresql OutOfMemory with Criteria.scroll() in Hibernate with 2M records带有 Criteria.scroll() 的 Postgresql OutOfMemory 在 Hibernate 中具有 2M 条记录
【发布时间】:2009-12-22 04:06:42
【问题描述】:

我在 PostgreSQL 上运行 Criteria.scroll() 在包含 2M 的数据库上 记录。内存不断增加,最后生成一个 内存不足异常。请您建议如何解决此问题。

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

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

感谢任何指导/建议。

【问题讨论】:

  • 客户端进程内存还是服务器内存?

标签: hibernate postgresql scroll out-of-memory


【解决方案1】:

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

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

您可能只想在循环的每 100 次左右迭代中清除一次会话。我会用几种不同的方式来计时,看看什么是最好的。

【讨论】:

    【解决方案2】:

    根据你写名字的方式,我猜这是一个 Java OutOfMemoryException。

    希望这不是很明显哈哈,但是当你执行 Criteria.scroll() 时你会得到一个 ScrollableResults,我假设你在处理这些数据时正在做一些事情。您是否将每个项目加载到内存中?

    或者你只是通过获取 ScrollableResults 得到这个错误?我会觉得这很奇怪。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 你永远不应该调用垃圾收集器。这样做甚至不能保证它会运行——这是对 JVM 的建议。更不用说默认的垃圾收集器在运行时会冻结整个应用程序。在它认为最好运行时让它运行。最后,在这种情况下它也无济于事 - Hibernate 会话正在保留对象。
        猜你喜欢
        • 2021-08-23
        • 1970-01-01
        • 2017-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-21
        相关资源
        最近更新 更多