2010-04-07 126 views
10

我正在設計一個基於Java的web-app,我需要一個鍵值存儲。 Berkeley DB似乎對我來說足夠合適,但似乎有兩個Berkeley DB可供選擇:用C實現的Berkeley DB Core和用純Java實現的Berkeley DB Java版。Berkeley DB Core和Berkeley DB之間的選擇JE

問題是,如何選擇使用哪一個?隨着網絡應用程序的可擴展性和性能非常重要(誰知道,也許我的想法將成爲下一個Youtube),我無法輕鬆找到兩者之間的任何有意義的基準。我還沒有熟悉Cores Java API,但我發現很難相信它可能比Java版本差得多,這似乎相當不錯。

如果其他一些鍵值存儲會更好,也可以隨意推薦。我存儲小小的二進制blob,鍵可能是數據的散列,或其他一些唯一的ID。

回答

2

如果你得到一個通用的接口,這些,並有一組合適的單元測試,你應該能夠平凡在以後的日子(也許當你真的需要做出基於確鑿的事實決定了兩者之間的交換不可用現在)

+2

只是一個警告:數據庫本身將* *不可*在版本之間移植。如果你沿着這條路線走下去,如果你發現自己想要交換實現,你需要一個數據本身的遷移策略。因此,如果數據的可移植性很重要,那麼最好使用Berkeley DB和Java API。 – Shaun 2010-04-11 13:25:07

2

我面臨同樣的問題,並決定去與Java版本,主要是因爲其便攜性(我需要的東西會跑,甚至在移動設備上)。還有直接持久層(DPL)API和整個數據庫是單個jar的事實使其部署相當簡單。

最近的第4版帶來了高可用性和性能改進。還有一個事實是,長期運行的Java應用程序可以實現這樣的優化,在某些情況下,它們將超越本機C應用程序的性能。

這是天生適合任何Java應用程序 - 桌面或網絡。

2

我前一段時間我有同樣的問題,做了一些基準測試後,我發現,在原生版本散列模式是遠遠超過任何Java版本所提供更快,存儲效率,所以我決定去與本地實現。

我建議你自己做你想要的存儲容量的基準,並決定Java版本是否足夠快。

如果是這樣,或者如果性能是不是對你的大問題(這對我來說重要的),只是去與Java版本。否則就與本機一起使用(假設你對自己的用例看到相同的性能提升)。

btw: 我的基準測試是從20,000,000個記錄中查詢隨機密鑰的速度,其中密鑰是一個字符串,其值是一個int(4字節)。 我看到插入(填充基準)在原生版本中快得多,查詢速度也快了一倍。

(這是不是由於Java的缺點,但由於Java版本是相同版本的本地版本不是 - 4.0 VS 4.8 IIRC)。

12

我有相當多的使用BDB-JE和BDB核心與Java的經驗。決定使用哪一個非常簡單:如果你想要併發,使用BDB-JE。如果您想要可擴展性,請使用BDB-core。

BDB-JE性能方面與大型數據庫壞了,由於它的文件格式和Java的垃圾回收的依賴清理收回的高速緩存條目。期望長時間的垃圾收集暫停或花費大量時間調整魔術GC設置。文件格式也有問題,因爲後臺清理器線程必須花費大量時間清理由早期緩存驅逐創建的垃圾。如果你的數據庫適合內存,BDB-JE工作得很好。

BDB核心依賴於頁面鎖定策略,高度併發的應用程序會遇到很多死鎖。如果您可以隨意排列操作,它可以減少死鎖的潛力,但它永遠不會消除它。由於BDB核心以更傳統的方式存儲數據,因此可擴展到超大尺寸,並具有可預測的性能和預期的性能下降。因爲它的緩存不是由垃圾收集器管理的,所以它可能非常大,並且不會造成任何暫停。

1

我決定去Java版,只是因爲它可能將數據庫運行時嵌入到相同的可部署內。這是我設置的重要功能。我沒有在覈心和JE之間進行基準測試,但是與我在首次評估數據庫商店時測試的其他關鍵值商店相比,我看到了很好的性能。

如果您正在創建一個Web應用程序,那麼從長遠來看,併發可能對您非常重要。