删除多数据库,单个Berkeley DB JE环境中的数据库

时间:2014-10-26 17:25:26

标签: java database scala berkeley-db-je

我在BerkeleyDB JE环境中有一个耦合的 main 和一个(临时和辅助)数据库。问题如下:

  • 我正在使用事务,原子性必须跨越主数据库和辅助数据库
  • 因此,据我了解文档,我必须使用单一环境(事务不能跨越多个环境)
  • 因此两个数据库共享一个目录。但他们也共享相同的文件吗?
  • 因为aux DB可以非常大,我想在应用程序开始时擦除它。
  • 我使用e.truncateDatabase(txn, name, false)来执行此操作
  • 但似乎数据库目录从不收缩,因此如果在每个应用程序运行中,辅助数据库使用例如500 MB,然后在四次运行后,目录已经是2 GB,而不管截断。另外,我看不到main和aux DB的不同文件

我如何真正擦除辅助数据库,以便释放磁盘空间?这也是一个性能问题,因为对于那些几GB的大型目录,BDB在启动和关闭时遇到严重问题。我可以强制BDB使用单独的文件,所以我只能删除一个特定的文件吗?


不知何故,这种单一环境似乎是问题的根源。例如,我希望通过提供辅助数据库setTxnNoSync()来提高性能,但这也会影响主数据库。


如果我在aux DB上使用setTemporary,我会收到运行时异常,显然不允许使用临时数据库的事务!?

  

java.lang.IllegalArgumentException:尝试打开Database aux,以下两个或多个以下独占属性为真:deferredWrite,temporary,transactional

1 个答案:

答案 0 :(得分:0)

我通过以下设置改善了这种情况:

envCfg.setConfigParam(EnvironmentConfig.CLEANER_MIN_FILE_UTILIZATION, "33")

在应用程序启动时使用removeDatabase而不是truncateDatabase。至少我似乎不再能获得无限增长。

我仍然有兴趣听听我是否可以让BDB为这两个数据库使用专用日志文件。