2012-01-06 12 views
5

私はキャッシュとしてだけでなく、オブジェクトが追い出されたり期限切れになったときにデータベースにフラッシュしたいダーティオブジェクトのコンテナとして、ehcacheを使いたいと思っています。通常の処理では、私はehcacheで検索するためにキーを使います。 keyがなければ、私はデータベースからデータを読んで、ehcacheに入れます。値は実際に私が変更する複雑なオブジェクトです。 ttl/idle time/overflow条件が発生すると、CacheEventListenerコールバックが呼び出されることがわかります。しかし、大きな問題があります。 notifyElementExpiredは、キー値がキャッシュから削除された後に呼び出されます。競合状態が存在します。私は、notifyElementExpiredでキャッシュにダーティー値をフラッシュするタスクを行うと同時に、別のスレッドで、同じキーが読み取られると、同期の問題が発生します。 2番目のスレッドはehcacheでオブジェクトを見つけられないので、もう1つのスレッドがまだフラッシュする準備ができている間にデータベースに移動します。このユースケースはehcacheでうまく動作しますか?

私はライトスルーehcacheを試してみましたが、私はそれも動作しているとは思わない。

ここに解決策がありますか?

ehcache以外のいくつかの他のキャッシュメカニズムが関わっていても、この問題に対する良い解決法がありがたいです。

おかげ

+0

私はこの質問に対する答えを自分で見つけることができませんでした。そこで私は先に進み、それを自分で解決しました!ここでは、私がブログした解決策です - http://blog.readypulse.com/2012/01/08/ehcache-as-a-true-persistent-store-backed-cache/ –

+1

良い仕事TVinodGupta。フレンドリーな思い出として、あなた自身が質問に答えを投稿し、その答えを受け入れてこの質問を閉じることができますか?また、問題を解決する場合は、以前の質問に対する回答を受け入れる必要があります。 – Zecas

答えて

1

あなたは純粋にメモリ内キャッシュでOKなら、私はGoogle Guava図書館のCacheLoaderを、元拡張勧めしたい:使用方法に続いて

public class DBLoader extends CacheLoader<String, String> { 

    @Override 
    public String load(String key) throws Exception { 
     // load a value from the database 
     return value; 
    } 
} 

を、何かのように:

private LoadingCache<String, String> dbCache = CacheBuilder.newBuilder() 
.expireAfterWrite(CACHE_EXPIRE_IN_SECONDS, TimeUnit.SECONDS) 
.build(new DBLoader()); 

String value = dbCache.get(someKey); 


もちろん、適切な例外処理を行うと、それを整理する必要があります。

eahcacheを適切に設定するよりもはるかに簡単です。

+1

グアバには独自の競合条件があります:https://github.com/google/guava/issues/1881 – CurtainDog

関連する問題