删除LOB不会降低Hibernate H2数据库大小

Phi*_*zin 7 sql hibernate jpa h2

我正在使用H2 1.4.196.我有一个保存LOB的Payload表.我通过Java程序触发删除表中的实体,并通过H2控制台验证表现在是否为空.

但是,db.mv文件的大小不会减小.重复创建和删除LOB使表空为空,但db.mv继续无限增长,并查看文件我仍然看到LOB内容.仅在DROP TABLE Payload上,db.mv文件的大小才会实际减小.

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

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

Phi*_*zin 4

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

\n\n

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

\n\n

根据http://h2database.com/html/features.html#compacting,\xe2\x80\x9c数据库文件中的空空间会自动重新使用。关闭数据库时,默认情况下数据库会自动压缩最多 200 毫秒。\xe2\x80\x9d Haven\xe2\x80\x99t 确实看到了我们的 LOB 的情况,因为数据库在其余的每次迭代中都会增长周一任务。

\n\n

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

\n\n

https://groups.google.com/forum/#!topic/h2-database/eXBzpF4WnNk : \xe2\x80\x9c请注意,如果删除数据,数据库文件不会\xe2\x80\x99缩小(但保持数据库打开) )。但是,文件内的空白空间会自动重新使用。仅当关闭数据库(关闭所有连接或运行 \xe2\x80\x9cshutdown\xe2\x80\x9d)时,数据库文件才会收缩。\xe2\x80\x9d

\n