私はGuavaキャッシュの問題に直面しています。キャッシュに要素が1つしかない場合は、問題はありません。私は2番目の要素をロードするときには、そのログが言う古いキーを考慮したGuavaキャッシュ
private static LoadingCache<String, MyClass> cache = null;
....
public MyClass method(final String id1, final long id2) {
log.error("inside with "+id1);
final String cacheKey = id1+"-"+id2;
if(cache == null){
cache = CacheBuilder.newBuilder()
.maximumSize(1000)
.build(
new CacheLoader<String, MyClass>() {
@Override
public MyClass load(String key) {
return getValue(cacheKey);
}
}
);
}
try {
return cache.get(cacheKey);
} catch (ExecutionException ex) {
log.error("EEE missing entry",ex);
}
}
private MyClass getValue(String cacheKey){
log.error("not from cache "+cacheKey);
...
}
以前のエントリのキーを選択しようとしている:私は呼び出すと、例えばのために
inside with 129890038707408035563943963861595603358
not from cache 1663659699-315839912047403113610285801857400882820 // This is key for the earlier entry
方法を(「1」、2)、それはキャッシュの値をロードし、私はその後キャッシュからそれを得ることができます。今度はメソッド( "3"、4)を呼び出します。これはキャッシュにないので、getValue()が呼び出され、メソッド( "1"、2)のキーがログ出力されます
どこが間違っていますか?
どのキー? –
キャッシュを初期化する方法はスレッドセーフではないことに注意してください。さらに、それは非常に悪いアプローチのように聞こえる非静的メソッドに基づくCacheLoaderを使用する静的キャッシュであり、あまりにもエラーを起こしやすい。あなたのミスはおそらくそれらのものの1つによると思われます。 –
このルール(http://stackoverflow.com/help/mcve)をお読みください –