1

膨大な量(〜1.000.000)のキーと値のペアを処理するJavaアプリケーションを開発しています。キーのサイズは固定されていますが、値のサイズは20バイトから最大1キロバイトまでさまざまです。したがって、最悪の場合、約1GBのデータを取得しました。
キーと値のペアは、複数のスレッド(〜3〜5スレッド)によって同時に読み取りおよび書き込みされます。読み取りおよび書き込み操作は、ほとんどの場合、単一のキーと値のペアにのみ影響します。
キーと値のペアの上に、目的のキーを選択するために使用されるリレーショナルデータモデルが配置されます。現在、リレーショナルデータにH2を使用していますが、キーと値のペアを格納するためにどのテクノロジを使用するかがわかりません。

  1. Key-Valueペアを格納するためにどのデータベースを使用する必要がありますか?
  2. さらに重要なのは、どのレベルで同期を実装する必要があるかということです。

    • データベース層は私には理にかなっているように見えますが、アプリケーション内の接続管理をどのように処理する必要がありますか?
    • 私の最初のアプローチ
      • 読み取り/書き込み操作ごとに接続プールと個別の接続を使用します。
        これは簡単に実装できますが、接続プールの同期がボトルネックになっているように思われます。
    • 私の2番目の解決策
      • すべての読み取り操作に単一の接続を使用し、すべての書き込み操作に別の接続を使用しますが、接続が同時アクセスを許可するかどうか、およびスケーラブルな方法でそれらをシリアル化するかどうかはわかりません。
  3. Key-ValueペアはJTablesによって定期的に照会されるため、アクセス時間は重要です。データベースのキャッシングシステムを信頼する必要がありますか、それともアプリケーション層に別のキャッシュ(EHCacheなど)を実装/使用する必要がありますか?

編集:
アプリケーションは古いPCで実行する必要があるため、データ全体をメモリに入れることはできません。
キーと値のペアを既存のH2データベースに保存することは可能ですが、パフォーマンスを向上させるために、キーと値のペアとそれらの同期に特化したデータベースにそれらを配置する方が理にかなっていますか?
ACIDのプロパティについても心配していません。

4

3 に答える 3

1

1)NoSQLデータベースは、キーによってのみ値にアクセスするという要件に適しているようです。バークレーは、注文されたKey-Valueストアです。キーの注文が必要ですか?そうでない場合は、他の解決策を確認してください:Mongo、couchbase。

2)データベースレベルでの同期が最も適切な選択です。だから私はあなたの最初のアプローチに行きます。2番目のアプローチは確かに競合を引き起こし、開発者にとって管理が難しくなります。

3)必要に応じてキャッシュします。レコードに頻繁にアクセスしましたか?EHCacheは問題ありませんが、memcacheなどの他のシステムを使用することもできます。選択したDBに合わせてキャッシュレイヤーを決定する必要があります。

于 2013-03-24T16:22:30.487 に答える
1

今日のデータベースでは、数百万のレコードまたは1GBのデータ量はそれほど多くありません。「従来の」DBRMS(PostgreSQL、MySQL、Oracleなど)を使用することも、「ホット」テクノロジー(H2、MongoDBなど)を使用することもできます。Oracle Berkeleyはデータをメモリに格納できるため、読み取りと書き込みが非常に高速になります。インデックスを作成します。

于 2013-03-24T16:28:26.130 に答える
0

まだチェックアウトしていない場合は、MongoDBをチェックアウトしてください。トランザクションではありませんが、ほとんどがメモリに常駐しており、ACIDityのすべての側面が必要ない場合は、スタックを簡素化できるようです。

于 2013-03-24T16:20:01.103 に答える