Отключение кэша EclipseLink


В моем приложении, когда пользователь входит в систему, система считывает некоторые настройки из БД и сохраняет их в сеансе пользователя. Система выполняет это действие с помощью запроса JPA, используя EclipseLink (JPA 2.0).

Когда я изменяю некоторые настройки в БД и снова вхожу в систему, запрос возвращает предыдущие результаты. Похоже, что EclipseLink кэширует результаты.

Я использовал это, чтобы исправить это поведение, но это не работает :

query.setHint(QueryHints.cache_usage,cacheUsage.no_cache);
2 5

2 ответа:

Если вы хотите задать подсказки запроса, то docs рекомендует сделать:

query.setHint("javax.persistence.cache.storeMode", "REFRESH");

Вы можете поочередно задать аннотацию затронутого объекта @Cacheable

@Cacheable(false)
public class EntityThatMustNotBeCached {
...
}

Если вы возвращаете какую-то сущность конфигурации и хотите убедиться, что данные не устаревшие, вы можете вызвать em.refresh(yourEntity) после возврата сущности из запроса. Это заставит провайдера JPA получать свежие данные из базы данных, несмотря на кэшированные.

Если вы хотите отключить кэш L2, вы можете использовать <shared-cache-mode>NONE</shared-cache-mode> в <persistence-unit> в persistence.xml или использовать Cacheable(false) непосредственно на вашем объекте конфигурации.

Если вы возвращаете простые поля вместо сущностей и все еще получаете устаревшие данные, вы можно попробовать очистить PersistenceContext, вызвав em.clear().