2016-05-23 2 views
4

Я использую 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 ... 
+0

Также добавление слушателя кеш-событий является хорошей практикой. Вы можете быть уверены в том, что происходит. http://www.ehcache.org/documentation/2.8/apis/cache-event-listeners.html –

ответ

1

Причиной этого проблема не EhCache - это кэш второго уровня JPA. Чтобы отключить весь кэш JPA добавить к вашему persistence.xml

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

И если вы хотите, чтобы отключить кэш для конкретного использования объекта @Cacheable(false) как класс аннотации вашей организации.

Также не рекомендуется использовать CacheType.NONE.

Обратите внимание: CacheType NONE в аннотации @Cache не должен использоваться для отключения кеша, вместо этого для общего доступа должно быть установлено значение false. [EclipseLink/Examples/JPA/Caching]

В качестве последнего параметра попробуйте вызвать обновление кеша подсказкой запроса.

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

Решено - большое спасибо! –

Смежные вопросы