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

HSQL and Hibernate - Out Of Memory error on many Delete Statements

我们在 java 项目中使用 Hibernate 3.6。10.Final 和 HSQL 2.3.2。 我有一个可重现的内存不足错误。

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

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

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

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

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

我在原问题中提到的删除语句很可能是无关紧要的:

谢谢

我们终于找到了 DELETE 语句占用所有内存的原因。 事实证明,在我们的第二个 运行 中,我们试图使用 TRUNCATE TABLE 语句对在第一个 运行 中创建的表进行 t运行 分类。

TRUNCATE TABLE 命令在单个事务中完成,因此 t运行cate 之前的状态保存在内存中,如下所述:

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