JPA 2 + EclipseLink : Caching Issue

2019-08-04 09:15发布

问题:

I have a strange behavior with caching and JPA Entities (EclipseLink 2.4.1 ) + GUICE PERSIST

I will not use caching, nevertheless I get randomly an old instance that has already changed in MySQL database.

I have tried the following:

  1. Add @ Cacheable (false) to the JPA Entity.

  2. Disable Cache properties in the persistence.xml file :

     <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>  

Even activating trace EclipseLink, i see the JPQL query:

ReadObjectQuery Execute query (name = "readObject" referenceClass = XX sql = "... (just making a call" find "the entityManager

but, However randomly returns an old value of that class.

Note

Perhaps happens for using different instances of EntityManager and everyone has their cache? I have seen the following related post : Disable JPA EclipseLink 2.4 cache If so, is possible to clear the cache of ALL EntityManager whithout using : ???? em.getEntityManagerFactory().getCache().evictAll(); Is it possible to clear ALL caches whithout using evictALL ??

回答1:

Evict all is for the shared cache which you have disabled already anyway. EntityManager instances are required by default to have a first level cache of their own to keep track of all managed instances they have created. An entityManager is meant to represent logical transactions and so should not be long lived. You need to throw away your EntityManagers and re obtain them or just clear them at logical points rather than let the number of managed entitites in its cache grow endlessly. This will also help limit the stale data issue, though nothing other than pessimistic locking can eliminate it. I recommend using optimistic locking if you aren't already to avoid overwriting with stale data.