私はEhCache v2.3.0をエンタープライズアプリケーションのEclipseLink v2.5.2とEJB 3.0と組み合わせて使用しています。EhCacheはキャッシュを更新しません
問題は、EhCacheのオブジェクトが更新されないということです。予想される動作は、キャッシュが60秒後に期限切れとなり、データをリロードすることです。実際には、キャッシュは60秒後に期限切れとなり、古いデータがリロードされます。
これは、エンティティキャッシュが「分離」に設定されている場合でも発生します。テスト目的のために、キャッシュタイプをnoneに設定することさえできますが、動作しません。
アイデアはありますか?ここで
はehcache.xmlです:
<ehcache name="testCache">
<defaultCache
timeToIdleSeconds="60"
timeToLiveSeconds="60"/>
<cache name="myCache"
timeToIdleSeconds="60"
timeToLiveSeconds="60"/></ehcache>
これは、コンテキストリスナーで、起動時に適切に負荷です。キャッシュが正しい値で設定されているので、私はデバッグモードでチェックしました。
キャッシュは、(それがシングルトン'S)initilized得た後、それはこの方法でアクセスしています:
/*
This method returns the current values in the cache as an list.
If the elements expired, it gets the new values from the database, puts them into the cache and return them as list.
*/
public List<CacheEntries> getEntries() {
EhCache cache = cacheManager.getEhCache("myCache");
cache.evictExpiredElements();
List<CacheEntries> list = new ArrayList<CacheEntries>();
if(cache.getSize() == 0) {
//get CacheEJB
list = cacheEjb.getAll();
for(CacheEntries e : list) {
cache.put(new Element(e.getName(), e));
}
}
else {
Element element = null;
List<String> keys = cache.getKeys();
for(String s : keys) {
element = cache.get(s);
list.add((CacheEntries) element.getValue());
}
}
return list;
}
したがってエンティティが注釈されている:
@Entity @Cache(type = CacheType.NONE, isolation = CacheIsolationType.ISOLATED) @Table ...
また、キャッシュイベントリスナーを追加することをお勧めします。あなたは何が起こっているのか本当に確かめることができます。 http://www.ehcache.org/documentation/2.8/apis/cache-event-listeners.html –