我在 BerkeleyDB JE 环境中有一个耦合的主数据库和一个(临时和辅助)数据库。问题如下:
- 我正在使用事务,原子性必须跨越主数据库和辅助数据库
- 因此,据我了解文档,我必须使用单个环境(事务不能跨越多个环境)
- 因此两个数据库共享一个目录。但他们也共享相同的文件吗?
- 因为辅助数据库可能会变得非常很大,我想在应用程序启动时删除它。
- 我已使用
e.truncateDatabase(txn, name, false)
来执行此操作 - 但是数据库目录似乎永远不会收缩,因此如果在每个应用程序中运行辅助数据库,都会使用例如500 MB,那么在四次运行之后,无论是否截断,该目录都已经是 2 GB。另外,我看不到主数据库和辅助数据库的不同文件
如何真正删除 aux 数据库,从而释放磁盘空间?这也是一个性能问题,因为对于那些几个 GB 的大目录,BDB 在启动和关闭时会遇到严重的问题。我可以强制 BDB 使用单独的文件,这样我就可以删除特定的文件吗?
<小时/>不知何故,这个单一环境似乎是问题的根源。例如,我希望通过提供辅助数据库 setTxnNoSync()
来提高性能,但这也会影响主数据库。
如果我在 aux DB 上使用 setTemporary
,我会收到运行时异常,显然不允许对临时数据库使用事务!?
java.lang.IllegalArgumentException: Attempted to open Database aux and two ore more of the following exclusive properties are true: deferredWrite, temporary, transactional
最佳答案
我通过以下设置稍微改善了情况:
envCfg.setConfigParam(EnvironmentConfig.CLEANER_MIN_FILE_UTILIZATION, "33")
并在应用程序启动时使用removeDatabase
而不是truncateDatabase
。至少我似乎不再获得无限成长了。
我仍然有兴趣了解是否可以让 BDB 对任一数据库使用专用日志文件。
关于java - 在多数据库、单 Berkeley DB JE 环境中删除数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26575803/