2017-02-06 6 views
0

リスト内の入力を検索したい。そのリストはデータベースに存在します。それを行うための2つのオプションがあります。データベース内のテーブルと同期してメモリ内のJavaリストを保持する方法は?

  1. 検索ごとにdbを押して結果を返します。
  2. テーブルに同期したコピーをメモリに保存し、メモリ内で検索して結果を返します。

それは速くなりますように私は、2番目のオプションを好みます。しかし、私はテーブルと同期してリストを保持する方法について混乱しています。

例:私は、リストL = [12,11,14,42,56]
を有し、Iは入力を受け取る:入力がリストに存在しない場合、14

私は結果を返すために必要か否か。リストは他のアプリケーションによって更新することができます。私はテーブルと同期してリストを保持する必要があります。

ここで最も最適化されたアプローチと、リストをデータベースと同期させる方法を教えてください。

必要に応じてリストをリロードできるように、アプリケーションでテーブルの変更を通知する方法はありますか。

+2

データベースを使用する必要があると仮定して#1に固執するだけです。データベースは、この目的のために正確に設計され最適化されています。 –

+1

#1のパフォーマンスが高すぎると、ライトスルーキャッシュはDBへのヒットを減らします。 – Kayaman

+0

#1が依然として遅すぎるとどうでしょうか。メモリリストを同期させるためにとにかくありますか? –

答えて

0

の代わりに既に存在している何かの独自の実装を再現し、私はそのようなEhcacheのような実装とHibernateのセカンドレベルキャッシュ(2LC)を活用します。

2LCを使用することにより、あなたはあなたのエンティティの生存時間有効期限を指定することができ、彼らは有効期限が切れた後、任意のクエリは、データベースからそれらをリロードします。エンティティキャッシュがまだ期限切れになっていない場合、Hibernateはそれらをデータベースではなく2LCアプリケーションキャッシュから水分補給します。

あなたが春を使用している場合は、@Cachableを見てみたいことがあります。これは、コンポーネント/ Bean層で動作し、Springが結果セットを名前付き領域にキャッシュすることを可能にします。詳細は、ドキュメントを参照してください。

+0

スケジュールされたリフレッシュ。オンデマンドリフレッシュのためのソリューションはありませんか?データが変更された場合にのみリロードできます。アプリケーションへのREST呼び出しをヒットしましたか? –

+1

はい、ほとんどのキャッシュプロバイダは、開発者にエントリを手動で削除する方法を提供します。データを退去させたオンデマンドジョブでこれを使用して、必要に応じてキャッシュを再投入するためにHibernateクエリを再実行することができます。 – Naros

+0

データが頻繁に更新されず、データの読み込みにコストがかかるというシナリオがある場合、トリガーの考え方は非常に興味深いものです。更新トリガーは、更新のタイムスタンプで読み込みが速い単純なテーブルを更新する可能性があります。そのシンプルな表を頻繁にチェックできます。タイムスタンプ>最後のリフレッシュタイムスタンプの場合は、メモリ内のデータを更新する必要があります。 – Bartez

0

要件を満たすには、読み書きを1か所で制御する必要があります。それ以外の場合は、データの非同期が常に発生します。

関連する問題