1

我对缓存和 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 缓存如果是这样,可以在不使用的情况下清除所有 EntityManager 的缓存:???? em.getEntityManagerFactory().getCache().evictAll(); 是否可以在不使用 evictALL 的情况下清除所有缓存?

4

1 回答 1

1

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

于 2014-01-06T12:37:52.620 回答