在我的应用程序中,当用户登录到系统时,系统会从DB读取一些设置,并将它们存储在用户的会话中。系统通过使用EclipseLink (JPA2.0)的JPA查询执行此操作。
当我更改DB中的一些设置并再次登录时,查询将返回前面的结果。EclipseLink似乎正在缓存结果。
我用它来纠正这种行为,但是它不工作
query.setHint(QueryHints.cache_usage,cacheUsage.no_cache);发布于 2011-12-05 02:12:12
如果要设置查询提示,文档建议执行:
query.setHint("javax.persistence.cache.storeMode", "REFRESH");可以交替设置受影响实体的@Cacheable注释
@Cacheable(false)
public class EntityThatMustNotBeCached {
...
}发布于 2011-12-04 12:39:40
如果要返回某种类型的配置实体,并且希望确保数据不过时,则可以在从查询中返回实体之后调用em.refresh(yourEntity)。这将迫使JPA提供程序在缓存的数据库中从数据库中获取新的数据。
如果要禁用L2缓存,可以在persistence.xml中的<persistence-unit>中使用<shared-cache-mode>NONE</shared-cache-mode>,也可以在配置实体上直接使用Cacheable(false)。
如果您返回的是普通字段而不是实体,并且仍然得到陈旧的数据,则可以尝试通过调用PersistenceContext来清除em.clear()。
https://stackoverflow.com/questions/8370203
复制相似问题