gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:00:29 25 4
gpt4 key购买 nike

我正在使用嵌入式 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 加密和 cryptLob 所做的那样,但永远不会这样做.

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

我试过在打开数据库后发出“SET FILES LOB COMPRESSED TRUE”语句,这对全新的数据库来说是正确的(lobs 被压缩,database.script 提到了 LOB 压缩)。

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

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

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

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

如果没有在没有剩余文档时关闭数据库、销毁它并创建一个新的数据库,然后手动发出 lob 压缩语句,我看不出有任何方法可以为具有现有数据库的应用程序启用 LOB 压缩。

我不是特别喜欢那个看起来很老套的选项。

我还没有尝试过 2.3.3,但从我对 sources 的观察来看,它在那个版本中看起来并没有更好。

是否有任何其他方法可以可靠地启用现有 HSQLDB 数据库的 LOB 压缩?甚至是“空”的?

最佳答案

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

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

如果数据库中没有lobs,你应该可以执行CHECKPOINT,然后使用SQL设置。如果这不起作用,还有下一个选项。

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

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

关于java - HSQLDB:为现有数据库启用 LOB 压缩,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31524124/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com