我正在使用H2 1.4.196。我有一个保存LOB的Payload表。我通过Java程序触发删除表中的实体,并通过H2控制台验证表现在是否为空。
但是,db.mv文件的大小不会减小。重复创建和删除LOB使表空为空,但db.mv继续无限增长,并查看文件我仍然看到LOB内容。仅在DROP TABLE Payload上,db.mv文件的大小才会实际减小。
我有一个理论认为它可能是一个开放的事务,但是SELECT * FROM INFORMATION_SCHEMA.SESSIONS
只显示了session sql语句创建的会话。
是什么导致无法真正删除LOB?
答案 0 :(得分:3)
更新:我找到了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并没有真正看到这种情况,因为数据库会增加其余任务的每次迭代。
它建议使用手册SHUTDOWN COMPACT
作为压缩更多
https://groups.google.com/forum/#!topic/h2-database/eXBzpF4WnNk:“请注意,如果删除数据(但保持数据库处于打开状态),数据库文件不会缩小。但是,文件中的空白空间会自动重复使用。如果关闭数据库(关闭所有连接或运行“shutdown”),数据库文件只会缩小。“