как отключить кеш в eclipselink

Я попытался отключить кэш L2 в EclipseLink с Eclipse Indigo, используя следующие свойства в файле persistence.xml: -

<property name="eclipselink.cache.shared.default" value="false"/>

<shared-cache-mode>NONE</shared-cache-mode>

По сути, я тестирую один сценарий: дважды ли один и тот же объект, созданный в двух разных сеансах, попадает в базу данных, или оба сеанса ссылаются на один и тот же объект, созданный в предыдущем сеансе в кэш-памяти. Это не должно происходить, потому что кэш L2 отключен, если упомянуть вышеупомянутые свойства в файле persistence.xml.

Мой код, как показано ниже: -

 Session session = DataAccessManager.getManager().openSession();
 ReferenceObjectRepository referenceObjectRepository =     ReferenceObjectRepository.getInstance();
 ReferenceObjectKey referenceObjectKey = new ReferenceObjectKey(getStringValue("testCacheByPass.input"));
 //load object first time.
 ReferenceObject referenceObject = referenceObjectRepository.load(ReferenceObject.class, referenceObjectKey);
 logger.log(Level.SEVERE, "Cache ReferenceObject: " + referenceObject);

 //load object in another session
 Session sessionNew = DataAccessManager.getManager().openNewSession();
 Object dbObject = referenceObjectRepository.load(ReferenceObject.class,    referenceObjectKey);
 logger.log(Level.SEVERE, "DB loaded ReferenceObject: " + dbObject);

Пожалуйста, помогите мне, я что-то пропустил? или мне нужно сделать это другим способом ??

 Chris17 окт. 2012 г., 22:08
Этот код полностью абстрагировал EclipseLink / JPA, что затрудняет проверку того, что вы используете отдельные экземпляры EntityManager для своих запросов. Сам код выглядит так, как будто вы повторно используете один и тот же referenceObjectRepository - может ли это быть частью проблемы? Если он повторно использует один и тот же базовый экземпляр EntityManager, требуется вернуть тот же экземпляр сущности, если он не был очищен.

Ответы на вопрос(2)

где выполняется вызов. Я использую функцию поиска, когда обращаюсь к представлению.

((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().invalidateAll();

Эта строка очищает кеш перед выполнением запроса.

public Entity find(Object id) {
    ((JpaEntityManager)em.getDelegate()).getServerSession().getIdentityMapAccessor().invalidateAll();
    return em.find(Entity.class, id);
}
 Xupypr MV27 янв. 2016 г., 18:26
Это работает! Но только когда я создал новыйEntityManager. EntityManager e = Context.getFactory().createEntityManager(); ((JpaEntityManager)e.getDelegate()).getServerSession().getIdentityMapAccessor().invalidateAll();

но я думаю, что у вас все еще есть кэш запросов в игре. Вы также сможете отключить кеш запросов

<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.refresh" value="true"/>

То же самое можно установить с помощью подсказок к запросу. Вы также можете попробовать использовать подсказки запросов, если настройка файла persistence.xml не работает.

Также обратите внимание, что, по сути, даже без кэширования вы сравниваете один и тот же объект, поэтому, если он не отсоединен,должен быть таким же.

Смежные вопросы:

Отключить кеширование eclipselink и кеширование запросов - не работает?Отключить кеширование в JPA (eclipselink)

Ваш ответ на вопрос