2016-05-23 14 views
4

Ich verwende EhCache v2.3.0 in Kombination mit EclipseLink v2.5.2 und EJB 3.0 in einer Enterprise-Anwendung.EhCache aktualisiert den Cache nicht

Das Problem ist, dass das Objekt von EhCache nicht aktualisiert wird. Das erwartete Verhalten ist, dass der Cache nach 60 Sekunden abläuft und die Daten neu lädt. Tatsächlich läuft der Cache nach 60 Sekunden ab und lädt die alten Daten neu.

Dies geschieht, obwohl der Entitätscache auf 'isoliert' gesetzt ist. Zu Testzwecken habe ich sogar den Cache-Typ auf none gesetzt, aber es funktioniert nicht.

Hat jemand eine Idee? Hier

ist die ehcache.xml:

<ehcache name="testCache"> 
<defaultCache 
    timeToIdleSeconds="60" 
    timeToLiveSeconds="60"/> 
<cache name="myCache" 
    timeToIdleSeconds="60" 
    timeToLiveSeconds="60"/></ehcache> 

Dies ist Last richtig beim Start im Kontext-Listener. Damit der Cache mit den richtigen Werten eingerichtet wird, habe ich im Debug-Modus eingecheckt.

Nachdem der Cache bekam initilized (es ist ein Singleton), ist es mit dieser Methode erreicht:

/* 
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; 

}

So hat das Unternehmen bezeichnet ist:

@Entity @Cache(type = CacheType.NONE, isolation = CacheIsolationType.ISOLATED) @Table ... 
+0

Das Hinzufügen eines Cache-Ereignis-Listeners ist ebenfalls eine gute Vorgehensweise. Du kannst dir wirklich sicher sein, was vor sich geht. http://www.ehcache.org/documentation/2.8/apis/cache-event-listeners.html –

Antwort

1

Die Ursache hierfür Problem ist nicht EhCache es ist der Second-Level-Cache von JPA. So deaktivieren Sie die ganze Cache JPA legen zum persistence.xml

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

Und wenn Sie den Cache für eine bestimmte Entität Verwendung @Cacheable(false) als Klasse Anmerkung auf Ihrer Einheit deaktivieren möchten.

Denken Sie auch daran, nicht CacheType.NONE zu verwenden.

Hinweis: Der CacheType NONE in der @Cache-Annotation sollte nicht zum Deaktivieren des Caches verwendet werden, stattdessen sollte shared auf false gesetzt werden. [EclipseLink/Examples/JPA/Caching]

Als letzte Option versuchen Sie eine Cache-Aktualisierung durch einen Abfragehinweis auszulösen.

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

Gelöst - vielen Dank! –

Verwandte Themen