11

JavaベースのWebアプリを設計していて、Key-Valueストアが必要です。Berkeley DBは私には十分に適しているように見えますが、Cで実装されているBerkeleyDBCoreと純粋なJavaで実装されているBerkeleyDBJavaEditionの2つのBerkeleyDBから選択できるようです。

問題は、どちらを使用するかをどのように選択するかです。Webアプリでは、スケーラビリティとパフォーマンスが非常に重要であり(誰が知っているか、私のアイデアが次のYouTubeになるかもしれません)、2つの間に意味のあるベンチマークを簡単に見つけることができませんでした。私はまだCoresJavaAPIに精通していませんが、JavaEditionsよりもはるかに悪い可能性があるとは信じがたいです。

他のKey-Valueストアの方がはるかに優れている場合は、それもお勧めします。小さいバイナリブロブを保存しています。キーはおそらくデータのハッシュ、またはその他の一意のIDになります。

4

5 に答える 5

12

私は、JavaでBDB-JEとBDB-coreの両方を使用した経験が豊富です。どちらを使用するかを決定するのは非常に簡単です。同時実行が必要な場合は、BDB-JEを使用してください。スケーラビリティが必要な場合は、BDBコアを使用してください。

BDB-JEは、ファイル形式と、削除されたキャッシュエントリをクリーンアップするためのJavaガベージコレクションへの依存により、大規模なデータベースでパフォーマンスを低下させます。長いガベージコレクションの一時停止を予期するか、マジックGC設定の調整に多くの時間を費やしてください。バックグラウンドクリーナースレッドは、初期のキャッシュエビクションによって作成されたガベージのクリーンアップに多くの時間を費やす必要があるため、ファイル形式にも問題があります。データベースがRAMに収まる場合、BDB-JEは非常にうまく機能します。

BDBコアはページロック戦略に依存しており、同時実行性の高いアプリケーションでは多くのデッドロックが発生します。操作をランダムに順序付けることができれば、デッドロックの可能性は減りますが、それがなくなることはありません。BDBコアは従来の方法でデータを保存するため、予測可能で予想されるパフォーマンスの低下を伴う超大型サイズに拡張できます。キャッシュはガベージコレクターによって管理されていないため、非常に大きくなり、一時停止を引き起こすことはありません。

于 2010-12-25T04:53:06.527 に答える
2

私は同じ問題に直面し、主にその移植性のためにJavaエディションを使用することにしました(モバイルデバイスでも実行できるものが必要です)。Direct Persistence Layer(DPL)APIもあり、db全体が単一のjarであるという事実により、そのデプロイメントはかなり簡単になります。

最近のバージョン4では、高可用性とパフォーマンスが向上しました。また、長時間実行されるJavaアプリケーションはこのような最適化を実現できるため、一部のシナリオではネイティブCアプリケーションのパフォーマンスを上回ります。

デスクトップやWebなど、あらゆるJavaアプリケーションに自然に適合します。

于 2010-04-07T15:28:55.603 に答える
2

これらに共通のインターフェースを導き出し、適切な単体テストのセットを持っている場合は、後日(おそらく、利用できない難しい事実に基づいて本当に決定を下す必要があるときに、2つを簡単に切り替えることができるはずです)。たった今)

于 2010-04-07T15:20:46.140 に答える
2

以前、同じ質問をしていましたが、いくつかのベンチマークを行った後、ネイティブエディションのハッシュモードは、Javaエディションが提供するものよりもはるかに高速でストレージ効率が高いことがわかったため、ネイティブ実装を使用することにしました。

期待するストレージ容量について独自のベンチマークを実行し、Javaエディションが十分に高速であるかどうかを判断することをお勧めします。

もしそうなら、あるいはパフォーマンスがあなたにとって大きな問題ではないなら(それは私にとって重要です)、Java版を使ってください。それ以外の場合は、ネイティブのものを使用します(独自のユースケースでも同じパフォーマンスの向上が見られると仮定します)。

ところで:私のベンチマークは、20,000,000レコードからランダムなキーをクエリする速度をテストしました。ここで、キーは文字列で、値はint(4バイト)です。挿入(ベンチマークへの入力)はネイティブバージョンの方がはるかに高速であり、クエリは2倍高速であることがわかりました。

(これはJavaの欠点によるものではありませんが、Javaバージョンがネイティブバージョンと同じバージョンではないためです-4.0対4.8 IIRC)。

于 2010-04-07T16:08:36.150 に答える
1

同じデプロイ可能ファイル内にデータベースランタイムを埋め込むことができるという理由だけで、JavaEditionを使用することにしました。これは私のセットアップにとって重要な機能でした。コアとJEのベンチマークは行っていませんが、データベースストアを最初に評価したときにテストした他のKey-Valueストアと比較して優れたパフォーマンスを確認しています。

ただし、Webアプリケーションを作成している場合は、長期的には並行性が非常に重要になる可能性があります。

于 2011-06-22T11:14:02.160 に答える