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