1

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

  • 我正在使用事务,原子性必须跨越主数据库和辅助数据库
  • 因此,据我了解文档,我必须使用单个环境(事务不能跨越多个环境)
  • 所以两个数据库共享一个目录。但是他们是否也共享相同的文件?
  • 因为辅助数据库可以变得非常大,我想在应用程序开始时擦除它。
  • 我曾经e.truncateDatabase(txn, name, false)这样做过
  • 但似乎数据库目录永远不会缩小,所以如果在每个应用程序运行中 aux DB 使用例如 500 MB,那么在运行四次之后,目录已经是 2 GB,无论截断如何。我也看不到主数据库和辅助数据库的不同文件

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


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


如果我setTemporary在辅助数据库上使用,我会得到一个运行时异常,显然不允许使用临时数据库的事务!?

java.lang.IllegalArgumentException: 尝试打开数据库辅助并且以下两个或多个独占属性为真:deferredWrite、临时、事务

4

1 回答 1

0

I improved the situation a bit with the following setting:

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

and using removeDatabase instead of truncateDatabase upon application start. At least I don't seem to get infinite growth any longer.

I'm still interested in hearing whether I can make BDB use dedicated log files for either database.

于 2014-10-26T18:49:02.317 回答