私はEhCacheのデコレータSelfPopulatingCache
を使用していますが、キャッシュが新しいエントリを読み込もうとしましたが、存在しません(データベースに存在しません)。したがって、キャッシュはnull
の値をキャッシュに入れ、そのキーの他の取得をブロック解除しますが、次のスレッドはキャッシュから「ヌル」を受け取ったため同じデータベース呼び出しを行います。これはエントリがロードされる必要があると考えていることを意味します。データはどこにも存在しないため、実際にはnullですが。私は何かが間違っているように感じる。Ehcache - データが存在しないときにSelfPopulatingCacheを使用する
(擬似コード)
Value v = cache.get(key); // multiple threads will block here
if (v == null)
cache.put(key, getValueFromDB()); // this might put a null value
私の現在のソリューションはnullで入れないことではなく、プレースホルダObject
を入れて、それをチェックすることです。
Value v = cache.get(key);
if (v == null)
cache.put(key, getValueFromDB());
else if (v == NOENTRYOBJECT)
return null;
else
return v;
考えられますか?
あなたの疑似コードが 'SelfPopulatingCache'にどのように関係しているかはっきりしません。どのようにそれを使用していますか? – skaffman
cache = SelfPopulatingCache(またはBlockingCache)...かなり明確だったと思った – Gandalf