JPA 2 +的EclipseLink:缓存问题(JPA 2 + EclipseLink : Cac

2019-10-19 04:40发布

我有一个缓存和JPA实体(EclipseLink的2.4.1)+吉斯持久化一个奇怪的行为

我不会使用缓存,但我得到随机在 MySQL数据库已经改变了旧的实例

我曾尝试以下:

  1. 添加@可缓存(假)的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执行查询(名称= “的readObject” referenceClass = XX SQL = “...(只拨打电话”找到“了EntityManager

但是,但是随机返回一个类的旧值。

注意

也许碰巧使用的EntityManager的不同情况和每个人都有自己的缓存? 我已经看到了以下相关岗位:禁用JPA的EclipseLink 2.4缓存如果是这样,可以清除所有的EntityManager的缓存使用内部消除:???? 。em.getEntityManagerFactory()getCache()evictAll(); 是否有可能清除所有的缓存使用内部消除?evictALL

Answer 1:

驱逐一切为了您已经禁用反正共享缓存。 EntityManager实例默认情况下,需要有一个属于自己的一级缓存,以保持自己建立的所有管理实例的轨道。 一个EntityManager是代表逻辑的交易,因此不应该长期存在。 你必须扔掉你EntityManagers并重新获得他们或只是在逻辑点清除它们,而不是让管理entitites的缓存数量增长不休。 这也将有助于限制陈旧数据的问题,但没有什么比悲观锁定其他可以消除它。 我建议,如果你是不是已经避免陈旧数据覆盖使用乐观锁。



文章来源: JPA 2 + EclipseLink : Caching Issue