膨大な量(〜1.000.000)のキーと値のペアを処理するJavaアプリケーションを開発しています。キーのサイズは固定されていますが、値のサイズは20バイトから最大1キロバイトまでさまざまです。したがって、最悪の場合、約1GBのデータを取得しました。
キーと値のペアは、複数のスレッド(〜3〜5スレッド)によって同時に読み取りおよび書き込みされます。読み取りおよび書き込み操作は、ほとんどの場合、単一のキーと値のペアにのみ影響します。
キーと値のペアの上に、目的のキーを選択するために使用されるリレーショナルデータモデルが配置されます。現在、リレーショナルデータにH2を使用していますが、キーと値のペアを格納するためにどのテクノロジを使用するかがわかりません。
- Key-Valueペアを格納するためにどのデータベースを使用する必要がありますか?
- 私の場合、Berkeley DBは適切ですか?
さらに重要なのは、どのレベルで同期を実装する必要があるかということです。
- データベース層は私には理にかなっているように見えますが、アプリケーション内の接続管理をどのように処理する必要がありますか?
- 私の最初のアプローチ
- 読み取り/書き込み操作ごとに接続プールと個別の接続を使用します。
これは簡単に実装できますが、接続プールの同期がボトルネックになっているように思われます。
- 読み取り/書き込み操作ごとに接続プールと個別の接続を使用します。
- 私の2番目の解決策
- すべての読み取り操作に単一の接続を使用し、すべての書き込み操作に別の接続を使用しますが、接続が同時アクセスを許可するかどうか、およびスケーラブルな方法でそれらをシリアル化するかどうかはわかりません。
Key-ValueペアはJTablesによって定期的に照会されるため、アクセス時間は重要です。データベースのキャッシングシステムを信頼する必要がありますか、それともアプリケーション層に別のキャッシュ(EHCacheなど)を実装/使用する必要がありますか?
編集:
アプリケーションは古いPCで実行する必要があるため、データ全体をメモリに入れることはできません。
キーと値のペアを既存のH2データベースに保存することは可能ですが、パフォーマンスを向上させるために、キーと値のペアとそれらの同期に特化したデータベースにそれらを配置する方が理にかなっていますか?
ACIDのプロパティについても心配していません。