我正在设计一个基于Java的网络应用程序,我需要一个键值存储。 Berkeley DB似乎适合我,但似乎有两个Berkeley DB可供选择:用C语言实现的Berkeley DB Core和用纯Java实现的Berkeley DB Java版。
问题是,如何选择使用哪一个?随着网络应用程序的可扩展性和性能非常重要(谁知道,也许我的想法将成为下一个Youtube),我无法轻易找到两者之间的任何有意义的基准。我还没有熟悉Cores Java API,但我发现很难相信它可能比Java版本更糟糕,这似乎相当不错。
如果其他一些键值存储更好,也可以随意推荐。我正在存储小的二进制blob,键可能是数据的哈希值,或者其他一些唯一的id。
答案 0 :(得分:12)
我有很多使用BDB-JE和BDB-core与Java的经验。决定使用哪一个非常简单:如果你想要并发,请使用BDB-JE。如果您想要可扩展性,请使用BDB核心。
BDB-JE由于其文件格式和依赖Java垃圾收集来清理被驱逐的缓存条目,因此在大型数据库中会破坏性能。预计长时间的垃圾收集暂停或花费大量时间调整魔术GC设置。文件格式也存在问题,因为后台清理程序线程必须花费大量时间来清理早期缓存驱逐所造成的垃圾。如果您的数据库适合RAM,BDB-JE可以很好地工作。
BDB-core依赖于页面锁定策略,高度并发的应用程序会遇到很多死锁。如果你可以随机命令操作,它可以减少死锁的可能性,但它永远不会消除它。由于BDB核心以更传统的方式存储数据,因此它可扩展到超大尺寸,具有可预测和预期的性能下降。因为它的缓存不是由垃圾收集器管理的,所以它可能非常大并且不会导致任何暂停。
答案 1 :(得分:2)
如果你得到一个通用的接口,并有一套合适的单元测试,你应该能够在以后的某个时间间隔进行交换(也许当你真的需要根据事实做出决定时)现在不可用)
答案 2 :(得分:2)
我遇到了同样的问题并决定使用Java版本,主要是因为它的可移植性(我需要在移动设备上运行的东西)。还有直接持久层(DPL)API以及整个数据库是单个jar的事实使得它的部署非常简单。
最新版本4带来了高可用性和性能改进。还有一个事实是,长时间运行的Java应用程序可以实现这样的优化,在某些情况下它们将超过本机C应用程序的性能。
它非常适合任何Java应用程序 - 桌面或网络。
答案 3 :(得分:2)
我刚才有同样的问题,在做了一些基准测试后,我发现原生版本中的哈希模式比java版本提供的任何东西都要快得多,存储效率也很高,所以我决定采用本机实现
我建议你为你期望的存储容量做自己的基准测试,并决定Java版本是否足够快。
如果是,或者性能对你来说不是一个大问题(这对我来说很重要),那就去Java版本吧。否则请使用本机(假设您看到自己的用例具有相同的性能提升)。
顺便说一句: 我的基准测试是测试从20,000,000条记录中查询随机密钥的速度,其中密钥是一个字符串,值是一个int(4字节)。 我看到使用本机版本插入(填充基准测试版)的速度要快得多,查询速度提高了一倍。
(这不是由于Java的缺点,而是因为Java版本与本机版本不同 - 4.0 vs 4.8 IIRC)。
答案 4 :(得分:1)
我决定使用Java版,因为它可以将数据库运行时嵌入到相同的可部署中。这是我的设置的一个重要功能。我没有在核心和JE之间进行基准测试,但与第一次评估数据库存储时测试的其他键值存储相比,我看到了很好的性能。
如果您正在创建一个Web应用程序,那么从长远来看,并发可能对您非常重要。