2016-05-23 10 views
4

私は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 ... 
+0

また、キャッシュイベントリスナーを追加することをお勧めします。あなたは何が起こっているのか本当に確かめることができます。 http://www.ehcache.org/documentation/2.8/apis/cache-event-listeners.html –

答えて

1

この原因問題はEhCacheではありません。JPAの第2レベルのキャッシュです。全体JPAキャッシュを無効にするには、あなたのpersistence.xml

<persistence-unit name="ACME"> 
    <shared-cache-mode>NONE</shared-cache-mode> 
</persistence-unit> 

にそして、あなたはあなたのエンティティのクラスの注釈として特定のエンティティの使用@Cacheable(false)のキャッシュを無効にしたい場合は追加します。

また、CacheType.NONEも使用しないことを検討してください。

@Cache注釈のCacheType NONEを使用してキャッシュを無効にする必要はなく、sharedをfalseに設定する必要があります。 [EclipseLink/Examples/JPA/Caching]

最後に、クエリヒントによるキャッシュの更新をトリガーします。

Query query = em.createQuery("Select e from Employee e"); 
query.setHint("javax.persistence.cache.storeMode", "REFRESH"); 
+0

解決済み - ありがとうございました! –

関連する問題