Я использую EhCache v2.3.0 в сочетании с EclipseLink v2.5.2 и EJB 3.0 в Enterprise Application.EhCache не обновляет кеш
Проблема в том, что объект EhCache не обновляется. Ожидаемое поведение заключается в том, что кеш истекает через 60 секунд и перезагружает данные. На самом деле происходит то, что кеш истекает через 60 секунд и перезагружает старые данные.
Это происходит, даже если кэш-память объекта задана как «изолированная». В целях тестирования я даже задал тип кеша none, но он не работает.
Есть идеи?
Вот ehcache.xml:
<ehcache name="testCache">
<defaultCache
timeToIdleSeconds="60"
timeToLiveSeconds="60"/>
<cache name="myCache"
timeToIdleSeconds="60"
timeToLiveSeconds="60"/></ehcache>
Это нагрузка должным образом при запуске в контекстно-прослушивателя. Итак, кеш настроен с правильными значениями, я проверил в режиме отладки.
После того, как кэш получил initilized (что это Singleton), это доступ с помощью этого метода:
/*
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 –