JPA2+EclipseLink:缓存问题



我在缓存和JPA实体(EclipseLink 2.4.1)+GUICE PERSIST 方面有一个奇怪的行为

我不会使用缓存,不过我随机得到一个MySQL数据库中已经更改的旧实例

我尝试过以下几种:

  1. 将@Cacheable(false)添加到JPA实体。

  2. 禁用persistence.xml文件中的缓存属性:

<class>MyEntity</class>
<shared-cache-mode>NONE</shared-cache-mode>    
<properties>      
<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.cache.size.default" value="0"/>
<property name="eclipselink.cache.type.default" value="None"/>
<property name="eclipselink.refresh" value="true"/>
<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.weaving" value="false"/>          
</properties>  

即使激活跟踪EclipseLink,我也会看到JPQL查询:

ReadObjectQuery执行查询(name="readObject"referenceClass=XX sql="…(只是调用"find"entityManager

但是,然而随机返回该类的旧值。

注意

使用EntityManager的不同实例,每个人都有自己的缓存,这可能会发生吗?我看到了以下相关的帖子:禁用JPA EclipseLink 2.4缓存如果是,则可以清除ALL EntityManager的缓存,而不使用:????em.getEntityManagerFactory().getCache().removeAll();是否可以清除所有缓存而不使用驱逐ALL

Evict all适用于您已经禁用的共享缓存。默认情况下,EntityManager实例需要有自己的一级缓存,以跟踪它们创建的所有托管实例。entityManager是用来表示逻辑事务的,因此不应该是长寿命的。您需要丢弃EntityManager并重新获取它们,或者只在逻辑点清除它们,而不是让其缓存中的托管实体数量无休止地增长。这也将有助于限制过时数据问题,尽管除了悲观锁定之外,没有什么能消除它。如果你还没有使用乐观锁定,我建议你使用乐观锁定来避免用过时数据覆盖。

最新更新