gpt4 book ai didi

hibernate - HSQL 和 Hibernate - 许多删除语句出现内存不足错误

转载 作者:行者123 更新时间:2023-12-02 23:45:09 25 4
gpt4 key购买 nike

我们在 java 项目中使用 Hibernate 3.6.10.Final 和 HSQL 2.3.2。我遇到了可重现的内存不足错误。

在读取堆转储时,我发现占用所有内存的对象是 org.hsqldb.Session特别是其中的 rowActionList 包含数十万个 RowAction 对象。

  • 所有 RowAction 对象都是类型 2,即删除语句。
  • HSQL 属性 hsqldb.cache_rowshsqldb.cache_size设置为默认值,我认为分别是 50,000 和 10,000。

自从提出问题以来,我们发现此 OOM 发生在以下场景中:

  1. 我们在大量数据上运行应用程序,这会导致大量插入语句(数十万条),并且我们通过不正确地关闭数据库来关闭应用程序(我们无法正确关闭,因为我们有一个关闭时间非常有限)。这是第一次运行后的数据库: enter image description here

  2. 然后我们第二次运行应用程序,我认为一旦我们打开数据库的 hibernate session ,内存就会开始以几秒钟的方式膨胀即使第二次运行没有执行任何删除语句。第二次运行后: enter image description here我们现在认为这是由 HSQLDB 执行的检查点引起的,该检查点是由于不正确的关闭而发生的。

我们是否正确?如果是,为什么检查点进程需要这么多内存?

我在原来的问题中讨论的删除语句很可能是不相关的:

  • 所有这些删除语句都是在同一个 hibernate session 下完成的。
  • 对于我们执行的每次删除:

        transaction = session.beginTransaction();
    session.delete(file);
    transaction.commit();

谢谢

最佳答案

我们终于找到了 DELETE 语句占用所有内存的原因。事实证明,在第二次运行中,我们尝试使用 TRUNCATE TABLE 语句截断第一次运行中创建的表。

TRUNCATE TABLE 命令是在单个事务中完成的,因此截断之前的状态保存在内存中,如下所述: Truncating takes too much time hsqldb

切换到 TRUNCATE TABLE tableName AND COMMIT 时,不会发生 OOM。

关于hibernate - HSQL 和 Hibernate - 许多删除语句出现内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37101383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com