java - 在多数据库、单 Berkeley DB JE 环境中删除数据库

标签 java database scala berkeley-db-je

我在 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/

相关文章:

java - 在显示文本之前完成动画

mysql - 在 MySql 中创建 View 时如何使用 select * 和 concat

scala - 在 Scala 中反转 map 的优雅方法

java - HashMap 在对象发生变化时自动更新

java - 使用 maven 损坏 zip 中的 JARS

java - 如何在 Clojure 中实现具有具体类型参数的接口(interface)?

java - 逃逸分析是否正确处理了 Thread.holdsLock()?

java - 使oracle的last_day函数在oracle和h2之间兼容

python - 直接抓取数据到 Cassandra 数据库

java - android.database.sqlite.SQLiteException : table contato has no column named