禁用EclipseLink缓存

时间:2011-12-03 19:09:26

标签: caching jpa-2.0 eclipselink

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

当我更改数据库中的某些设置并再次登录时,查询将返回先前的结果。似乎EclipseLink正在缓存结果。

我用它来纠正这种行为,但它不起作用

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

2 个答案:

答案 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()