2011-12-22 14 views
-1

私の質問は多少キャッシングに関連しています。いくつかのスレッドが2秒ごとに情報にアクセスしていて、3分ごとにデータベースに更新されているとします。これらのスレッドによって取得された情報のハッシュマップを作成し、3分ごとに更新し、すべてのスレッドがハッシュマップからデータを取得している。私の質問は、「3分後にハッシュマップが他のスレッドによって更新され、常にスレッドが最新の情報を取得するようにするにはどうすればよいでしょうか」という質問です。与えられた時刻にスレッドを実行する

1)データを保護ロックを取得:

+0

正確に3分を指定し、最新の情報を持っています。これは達成するのは難しいでしょう。正確に3分後にチェックするスレッドを持っていると想像してください。入力は少し遅く、例えば3分1マイクロ秒です。これで古いデータが読み込まれます。通常、キャッシングを使用すると、ある程度の "staleness"を受け入れます。データベースが変更についてあなたのプログラムに通知する方法はありますが、あなたの説明から不必要に複雑に聞こえるかもしれません。 –

+0

@Rogerキャッシュを使ってデータの古さを取り除くことはできないと言うことができます。memcacheのような市販のツールがあるので、この問題を取り除くことはできません。 –

+0

[Cache with Fixed Expiry Time Java](http://stackoverflow.com/questions/2340578/cache-with-fixed-expiry-time-in-java) – Bohemian

答えて

0

あなたがデータにアクセスするには、このようにロジックを使用することができます。

2)データが最後に更新された日時を確認します。

3)十分なデータがある場合は、必要なデータをコピーしてロックを解除し、を停止します。

4)データを更新します。

5)

6ステップ2でチェックされているタイムスタンプを更新します)は、新たなデータをコピーします。

7)ロックを解除します。

また、必要に応じてデータを更新する専用のスレッドを用意することもできます。

+0

スレッドがhashMapやコレクションからデータを取得するたびに、データはデータベースと同期しています。常に新しいデータを意味しますか? –

+0

常に新しいデータが必要な場合は、キャッシュしないでください。 –

+0

しかし、5分後に私のデータがデータベースで更新されるという特定のタイミングを知っていれば、だから最新のデータをキャッシュして入手することに問題があります。新鮮なデータとは、DBと同じデータを意味します。 –

関連する問題