2011-12-03 161 views
4

在我的应用程序中,当用户登录系统时,系统从DB读取一些设置并将它们存储在用户的会话中。系统通过使用EclipseLink的JPA查询执行此操作(JPA 2.0)。禁用EclipseLink缓存

当我更改数据库中的某些设置并重新登录时,查询将返回以前的结果。看来EclipseLink正在缓存结果。

我已经使用这个来纠正这种行为,但它不工作

query.setHint(QueryHints.cache_usage,cacheUsage.no_cache); 

回答

6

如果你想设置查询提示,则docs建议这样做:

query.setHint("javax.persistence.cache.storeMode", "REFRESH"); 

或者,您可以设置受影响的实体的@Cacheable注释

@Cacheable(false) 
public class EntityThatMustNotBeCached { 
... 
} 
3

如果你返回某种配置实体,并希望确保数据不陈旧,你在从查询中返回实体后可以调用em.refresh(yourEntity)。这将迫使JPA提供者从数据库中获取新数据,尽管缓存了一个。

如果您希望禁用您可以在persistence.xml<persistence-unit>使用<shared-cache-mode>NONE</shared-cache-mode>或直接在您的配置实体使用Cacheable(false) L2高速缓存。

如果您要返回普通字段而不是实体,并且仍旧收到过时的数据,则可以尝试通过调用em.clear()来清除PersistenceContext