EhCache不更新缓存

时间:2016-05-23 09:43:39

标签: jpa java-ee caching eclipselink ehcache

我在企业应用程序中将EhCache v2.3.0与EclipseLink v2.5.2和EJB 3.0结合使用。

问题是,EhCache的对象没有更新。预期的行为是,缓存在60秒后过期并重新加载数据。实际发生的是,缓存在60秒后过期并重新加载旧数据。

即使实体缓存设置为“隔离”,也会发生这种情况。出于测试目的,我甚至将缓存类型设置为none,但它不起作用。

有人有想法吗?

这是ehcache.xml:

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

在Context-Listener中启动时正确加载。所以使用正确的值设置缓存,我已经在调试模式中进行了检查。

在Cache启动后(它是一个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 ...

1 个答案:

答案 0 :(得分:1)

此问题的原因不是EhCache它是JPA的二级缓存。要禁用整个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");