首页 文章

HSQLDB:为现有数据库启用LOB压缩

提问于
浏览
2

我正在使用嵌入式HSQLDB 2.3.2实例在应用程序中将XML文档作为LOB存储一段时间,该应用程序与文档应该结束的任何地方间歇性连接 .

为了限制HSQBDL的.lobs文件大小增长,我通过documentation中提到的jdbc连接URL启用了LOB压缩(使用hsqldb.lob_compressed = true),但是从我最近发现的这个URL参数没有任何影响 .

如果我理解HSQLDB JDBC URL正确解析代码,org.hsqldb.persist.Logger #setVariables()应该在某个时候检查HsqlDatabaseProperties.hsqldb_lob_file_compressed来设置propCompressLobs,就像它对LOB加密和cryptLobs一样,但是从不这样做 .

使用URL中的此类参数创建的数据库中的database.script文件尽管有URL参数,但未提及LOB压缩,并且不压缩LOB .

我在打开数据库之后尝试发出“SET FILES LOB COMPRESSED TRUE”语句,这对于一个全新的数据库正常工作(lobs得到压缩,database.script提到LOB压缩) .

当我尝试使用其中一个现有数据库时,由于现有的LOB而出现错误(错误消息是“正在使用的数据文件”) . 我理解这背后的原因,因为压缩所有LOB可能需要一段时间,并且可能是一个非常长的运行操作,如果被中断,可能会使db处于错误状态 .

我认为我可以解决这个限制,因为有时XML文档被删除(最终被发送后),所以理论上DB在某些时候没有LOB .

不幸的是,这个错误也发生在空数据库上,因为有未使用的已删除LOB的LOB条目,我认为这些条目保留在那里以回收.lobs文件空间 . 似乎负责允许LOB压缩模式更改的org.hsqldb.persist.Logger #setLobFileCompressed()方法仅检查SYSTEM_LOBS.LOB_IDS中的条目数,无论它们当前是否正在使用 .

根据我的阅读,没有办法清除已删除的LOB条目(例如减少.lobs文件大小),所以基本上即使当前存储在LOB中的所有XML文档都从数据库发送和清除,这也不是是一个启用压缩的好时机,因为删除的LOB会留下足以阻止启用压缩的脚印 .

如果没有文件,关闭数据库,销毁它,创建一个新数据库,然后手动发出lob压缩语句,我没有看到任何为现有数据库的应用程序启用LOB压缩的方法 .

我并不是特别喜欢那种看起来像是hackish的选择 .

我还没有尝试过2.3.3,但从我看到的sources来看,它在那个版本中看起来并没有好转 .

有没有其他方法可靠地启用现有HSQLDB数据库的LOB压缩?即使是“空”的?

2 回答

  • 1

    URL上的压缩设置仅在创建数据库时有效 . SQL设置可以在没有lob历史记录的空数据库上执行 .

    压缩功能在版本2.0之后添加了很长时间,支持非压缩的lob数据 . 无法更改现有数据库的设置 .

    如果数据库中没有lobs,则应该能够执行CHECKPOINT,然后使用SQL设置 . 如果这不起作用,则有下一个选项 .

    如果数据库没有lobs(但可以有其他数据),则可以关闭数据库,然后编辑.script文件并删除SYSTEM_LOBS的 INSERT INTO ... 条目,并添加出现在新数据库中的默认条目 INSERT INTO BLOCKS VALUES(0,2147483647,0) . 如果这样做,您也应该删除.lobs文件 .

    您可以使用SQL来选择表单SYSTEM_LOBS表来检查其内容,但不能修改它们 .

  • 0

    我已经找到了一种方法,只使用SQL可靠地完成它,无论数据库是新数据库还是已经看过某些活动的现有数据库 .

    • 确保有0个现有LOB使用 select count(*) from SYSTEM_LOBS.LOB_IDS

    • 在任何具有LOB的表中插入一行,因此LobManager usageChanged设置为true .

    • 提交 .

    • 删除刚刚创建的行 .

    • 再次提交 .

    • 执行 CHECKPOINT 以清除所有lob元数据 . 由于最近添加了LOB,检查点实际上将运行LobManager.deleteUnusedLobs()并清除未使用的lob条目 .

    • 使用 SET FILES LOB COMPRESSED TRUE 启用压缩 . 这现在有效,因为SYSTEM_LOBS.LOB_IDS表中不再有任何内容 .

    如果你想要可靠地修剪HSQLDB .lobs文件,因为压缩不活动而变大了:

    • 使用LOB插入另一行,以便HSQLDB可以计算高空占用空间(LobManager.getLobUseLimit在检查点期间没有LOB时不起作用)

    • 提交

    • 再次执行 CHECKPOINT ,以便将lob文件修剪为使用情况 .

    • 删除在检查点之前创建的行 .

    • 提交

相关问题