在我的应用程序中,当用户登录系统时,系统从DB读取一些设置并将它们存储在用户的会话中。系统通过使用EclipseLink的JPA查询执行此操作(JPA 2.0)。禁用EclipseLink缓存
当我更改数据库中的某些设置并重新登录时,查询将返回以前的结果。看来EclipseLink正在缓存结果。
我已经使用这个来纠正这种行为,但它不工作:
query.setHint(QueryHints.cache_usage,cacheUsage.no_cache);
在我的应用程序中,当用户登录系统时,系统从DB读取一些设置并将它们存储在用户的会话中。系统通过使用EclipseLink的JPA查询执行此操作(JPA 2.0)。禁用EclipseLink缓存
当我更改数据库中的某些设置并重新登录时,查询将返回以前的结果。看来EclipseLink正在缓存结果。
我已经使用这个来纠正这种行为,但它不工作:
query.setHint(QueryHints.cache_usage,cacheUsage.no_cache);
如果你想设置查询提示,则docs建议这样做:
query.setHint("javax.persistence.cache.storeMode", "REFRESH");
或者,您可以设置受影响的实体的@Cacheable
注释
@Cacheable(false)
public class EntityThatMustNotBeCached {
...
}
如果你返回某种配置实体,并希望确保数据不陈旧,你在从查询中返回实体后可以调用em.refresh(yourEntity)
。这将迫使JPA提供者从数据库中获取新数据,尽管缓存了一个。
如果您希望禁用您可以在persistence.xml
内<persistence-unit>
使用<shared-cache-mode>NONE</shared-cache-mode>
或直接在您的配置实体使用Cacheable(false)
L2高速缓存。
如果您要返回普通字段而不是实体,并且仍旧收到过时的数据,则可以尝试通过调用em.clear()
来清除PersistenceContext
。