Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HSQLDB:为现有数据库启用LOB压缩_Java_Hsqldb - Fatal编程技术网

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

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()应该在某个

我正在使用一个嵌入式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,但从我看到的来看,它在那个版本中看起来并没有任何改进


是否有其他方法可以可靠地启用现有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条目
  • 使用
    SET FILES LOB COMPRESSED TRUE
    启用压缩。这现在起作用了,因为SYSTEM_LOBS.LOB_IDS表中不再有任何内容
然后,如果要可靠地修剪由于压缩未激活而变得巨大的HSQLDB.lobs文件,请执行以下操作:

  • 插入另一个具有LOB的行,以便HSQLDB可以计算LOB空间使用情况(当检查点期间没有LOB时,LobManager.getLobUseLimit不起作用)
  • 承诺
  • 再次执行
    检查点
    ,使lob文件根据使用情况进行修剪
  • 删除在检查点之前创建的行
  • 承诺

如果可能,我希望避免弄乱数据库文件。当我知道没有任何LOB时,是否可以从LOB_ID和LOB中删除,然后插入您提到的行,或者这对于在线数据库是个坏主意?此外,连接属性实际上没有任何影响,即使是在新的数据库上。尝试使用以下URL从DatabaseManagerSwing打开独立数据库:
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中应用