JPA 2 + 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. Если это так, можно очистить кэш ВСЕХ EntityManager без использования:???? . em.getEntityManagerFactory() getCache() evictAll(). Можно ли очистить ВСЕ кеши без использования evictALL??

1 ответ

Evict все для общего кэша, который вы все равно отключили. По умолчанию экземпляры EntityManager должны иметь собственный кэш первого уровня, чтобы отслеживать все созданные ими управляемые экземпляры. EntityManager предназначен для представления логических транзакций и поэтому не должен быть долгоживущим. Вы должны выбросить свои EntityManager и повторно получить их или просто очистить их в логических точках, а не позволять бесконечно расти количеству управляемых прав в его кеше. Это также поможет ограничить проблему устаревших данных, хотя ничто, кроме пессимистической блокировки, не может устранить ее. Я рекомендую использовать оптимистическую блокировку, если вы еще этого не делаете, чтобы избежать перезаписи устаревшими данными.

Другие вопросы по тегам