在Berkeley DB Core和Berkeley DB JE之间进行选择

zok*_*ier 11 java berkeley-db berkeley-db-je

我正在设计一个基于Java的网络应用程序,我需要一个键值存储.Berkeley DB似乎适合我,但似乎有两个Berkeley DB可供选择:用C语言实现的Berkeley DB Core和用纯Java实现的Berkeley DB Java Edition.

问题是,如何选择使用哪一个?随着网络应用程序的可扩展性和性能非常重要(谁知道,也许我的想法将成为下一个Youtube),我无法轻易找到两者之间的任何有意义的基准.我还没有熟悉Cores Java API,但我发现很难相信它可能比Java版本更糟糕,Java版本看起来相当不错.

如果其他一些键值存储更好,也可以随意推荐.我正在存储小的二进制blob,键可能是数据的哈希值,或者其他一些唯一的id.

bon*_*ill 12

我有很多使用BDB-JE和BDB-core与Java的经验.决定使用哪一个非常简单:如果你想要并发,请使用BDB-JE.如果您想要可扩展性,请使用BDB核心.

由于其文件格式和依赖Java垃圾收集来清理被驱逐的缓存条目,BDB-JE在大型数据库中打破了性能.预计长时间的垃圾收集暂停或花费大量时间调整魔术GC设置.文件格式也存在问题,因为后台清理程序线程必须花费大量时间来清理早期缓存驱逐所造成的垃圾.如果您的数据库适合RAM,BDB-JE可以很好地工作.

BDB-core依赖于页面锁定策略,高度并发的应用程序会遇到很多死锁.如果你可以随机命令操作,它可以减少死锁的可能性,但它永远不会消除它.由于BDB核心以更传统的方式存储数据,因此它可扩展到超大尺寸,具有可预测和预期的性能下降.因为它的缓存不是由垃圾收集器管理的,所以它可能非常大并且不会导致任何暂停.


Bri*_*new 2

如果您派生出这些的通用接口,并且拥有一组合适的单元测试,那么您应该能够在以后轻松地在两者之间进行交换(也许当您确实需要根据不可用的确凿事实做出决定时)现在)

  • 只是对此发出警告:数据库本身“不能”在版本之间移植。如果您沿着这条路线走下去,如果您发现自己想要交换实现,那么您将需要数据本身的迁移策略。因此,如果数据的可移植性很重要,那么您最好使用 Berkeley DB 和 Java API,而不是 Java 版本。 (2认同)