Java HSQLDB:为现有数据库启用LOB压缩
我正在使用一个嵌入式HSQLDB2.3.2实例将XML文档作为LOB存储在一个应用程序中一段时间,该应用程序与文档应该结束的地方有间歇性连接 为了限制HSQBDL的.lobs文件大小的增长,我通过中提到的jdbc连接URL启用了LOB压缩(使用hsqldb.LOB_compressed=true),但从我最近发现的情况来看,这个URL参数没有任何效果 如果我正确理解了HSQLDB JDBC URL解析代码,org.HSQLDB.persist.Logger#setVariables()应该在某个时候检查HsqlDatabaseProperties.HSQLDB_lob_file_compressed以设置propCompressLobs,就像它对lob crypto&CryptoLobs所做的那样,但决不会这样做 在URL中使用此参数创建的数据库中的database.script文件没有提到LOB压缩,尽管URL参数是正确的,并且不会压缩LOB 我尝试在打开数据库之后发出一个“SET FILES LOB COMPRESSED TRUE”语句,这对于一个全新的数据库是正确的(LOB被压缩,database.script提到LOB压缩) 当我对周围的一个现有数据库进行此操作时,由于现有LOB而出现错误(错误消息是“数据文件正在使用”)。我理解这背后的原因,因为压缩所有LOB可能需要一段时间,并且可能是一个非常长的运行操作,如果中断,可能会使db处于不良状态 我想我可以绕过这个限制,因为有时候XML文档会被删除(在它们最终被发送之后),所以理论上DB在某个时候是没有LOB的 不幸的是,这个错误也会发生在空数据库上,因为删除的LOB中有未使用的LOB条目,我认为这些条目保存在那里是为了回收.LOBs文件空间。似乎负责允许LOB压缩模式更改的org.hsqldb.persist.Logger#setLobFileCompressed()方法只检查SYSTEM_LOBS.LOB_ID中的条目数,无论它们当前是否正在使用 据我所知,没有办法清除已删除的LOB条目(例如减少.lobs文件大小),因此基本上即使当前存储在LOB中的所有XML文档都已发送并从数据库中清除,现在不是启用压缩的好时机,因为删除的LOB会留下阻止启用压缩的封装外形 因此,除了在数据库没有文档时关闭它、销毁它、创建一个新的数据库,然后手动发出lob compression语句之外,我看不到任何方法可以为具有现有数据库的应用程序启用lob压缩 我并不特别喜欢那个看起来像是黑客的选择 我还并没有试过2.3.3,但从我看到的来看,它在那个版本中看起来并没有任何改进Java HSQLDB:为现有数据库启用LOB压缩,java,hsqldb,Java,Hsqldb,我正在使用一个嵌入式HSQLDB2.3.2实例将XML文档作为LOB存储在一个应用程序中一段时间,该应用程序与文档应该结束的地方有间歇性连接 为了限制HSQBDL的.lobs文件大小的增长,我通过中提到的jdbc连接URL启用了LOB压缩(使用hsqldb.LOB_compressed=true),但从我最近发现的情况来看,这个URL参数没有任何效果 如果我正确理解了HSQLDB JDBC URL解析代码,org.HSQLDB.persist.Logger#setVariables()应该在某个
是否有其他方法可以可靠地启用现有HSQLDB数据库的LOB压缩?即使是“空”的,URL上的压缩设置也只有在创建数据库时才有效。SQL设置可以在没有lob历史记录的空数据库上执行 压缩功能是在支持非压缩lob数据的2.0版之后很久才添加的。无法更改现有数据库的设置 如果数据库中没有LOB,则应该能够执行检查点,然后使用SQL设置。如果这不起作用,还有下一个选择 如果数据库没有LOB(但可以有其他数据),则可以关闭数据库,然后编辑.script文件,删除系统LOB的
插入…
条目,并添加新数据库中出现的默认条目插入块值(02147483647,0)
。如果这样做,还应该删除.lobs文件
您可以使用SQL选择form SYSTEM_LOBS表以检查其内容,但不能修改它们。我找到了一种方法,可以仅使用SQL可靠地完成这项工作,无论db是新的还是已看到某些活动的现有db
- 使用
select count(*)from SYSTEM\u LOBs.LOB\u IDS
- 在任何具有LOB的表中插入一行,以便将LobManager usageChanged设置为true
- 承诺
- 删除刚创建的行
- 再次承诺
- 执行
,以便清除所有lob元数据。由于最近添加了LOB,检查点实际上将运行LobManager.deleteUnusedLobs()并清理未使用的LOB条目检查点
- 使用
启用压缩。这现在起作用了,因为SYSTEM_LOBS.LOB_IDS表中不再有任何内容SET FILES LOB COMPRESSED TRUE
- 插入另一个具有LOB的行,以便HSQLDB可以计算LOB空间使用情况(当检查点期间没有LOB时,LobManager.getLobUseLimit不起作用)
- 承诺
- 再次执行
,使lob文件根据使用情况进行修剪检查点
- 删除在检查点之前创建的行
- 承诺
jdbc:hsqldb:file:C:/db/test.db;关机=真;syntax_ora=true;hsqldb.default_table_type=cached;hsqldb.nio_data_file=false;hsqldb.tx=mvcc;hsqldb.lob_compressed=true代码>然后执行关机。以这种方式创建的数据库在其test.db.script中没有SET FILES LOB COMPRESSED TRUE
,并且LOB不会被压缩。URL属性不会在creati中应用