【问题标题】:Deleting LOBs does not decrease Hibernate H2 DB size删除 LOB 不会减少 Hibernate H2 DB 大小
【发布时间】:2018-06-12 15:17:50
【问题描述】:

我正在使用 H2 1.4.196。我有一个包含 LOB 的有效负载表。我通过 Java 程序触发删除表中的实体,并通过 H2 控制台验证表现在为空。

但是,db.mv 文件的大小并没有减小。 LOB 的重复创建和删除使表为空,但 db.mv 继续无限增长,查看文件我仍然可以看到 LOB 内容。只有在 DROP TABLE Payload 时,db.mv 文件的大小才会真正减小。

我有一个理论认为它可能是一个开放的事务,但SELECT * FROM INFORMATION_SCHEMA.SESSIONS 只显示了由会话 sql 语句创建的会话。

什么可能导致无法真正删除 LOB?

【问题讨论】:

  • 我在这里根据直觉推测,但缩小和增加文件大小是一项昂贵的 I/O 操作。那些老式的旋转硬盘驱动器很慢。因此,很多数据库会释放表中的空间,但实际上并没有释放空的文件空间。看到这个stackoverflow.com/questions/11784497/h2-db-file-keeps-growing 我怀疑 H2 只是将该行标记为已删除而不删除数据以获得最佳性能。

标签: sql hibernate jpa h2


【解决方案1】:

更新:我找到了https://github.com/h2database/h2database/issues/681,并且从源代码构建以包含 11 月 29 日的提交导致数据库文件成功减少。但是,删除传播并反映在文件大小中大约需要 20 秒,并且在此时间范围内的插入导致删除永远不会完成。

类似的问题已经存在多年:https://groups.google.com/forum/#!topic/h2-database/CGXOfSx_Vq4

根据http://h2database.com/html/features.html#compacting,“数据库文件中的空白空间自动重新使用。关闭数据库时,默认情况下数据库会自动压缩最多 200 毫秒。”我们的 LOB 并没有真正看到这种情况,因为 DB 在 rest mon 任务的每次迭代中都会增长。

它建议使用手册 SHUTDOWN COMPACT 作为压缩更多的解决方法

https://groups.google.com/forum/#!topic/h2-database/eXBzpF4WnNk:“请注意,如果您删除数据,数据库文件不会缩小(但要保持数据库打开)。但是,文件中的空白空间会自动重新使用。只有关闭数据库(关闭所有连接或运行“关闭”),数据库文件才会缩小。”

【讨论】:

    猜你喜欢
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 2020-04-23
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多