Как отключить спящий режим кэширования - PullRequest
27 голосов
/ 30 сентября 2010

Я пытаюсь написать класс модульного теста, который должен будет использовать один и тот же запрос для получения результатов из базы данных два раза в одном и том же методе теста.Но поскольку кэш Hibernate включен во второй раз, он на самом деле не попадает в базу данных, а просто извлекает результаты из кэша.

Может кто-нибудь ответить, как отключить кэширование в persistence.xml.

Я пыталсяотключить, изменив свойства hibernate.cache.use.query_cache = false и hibernate.cache.use_second_level_cache = false.

Но это не сработало.

Ответы [ 7 ]

20 голосов
/ 30 сентября 2010

Может кто-нибудь ответить, как отключить кеширование в persistence.xml.

Кэш второго уровня и кэш запросов по умолчанию отключены (и запросы не кэшируются, если вы не явно кеширует их).Кэш первого уровня не может быть отключен.

Я пытался отключить, изменяя свойства (...)

Это отключило бы кэш второго уровня и кеш запросов, , если онибыли включены.

Но это не сработало.

Если честно, "это не сработало" - очень плохое описание текущего поведения противожидаемый.Предоставление более подробной информации, (псевдо) кода, трассировки SQL, вероятно, помогло бы.

При этом, если вопрос касается HQL, запрос HQL обязательно должен попасть в базу данных при последующем выполнении (без кеша запросов).Активируйте ведение журнала SQL, если необходимо соблюдать это.

Если вопрос касается Session#get() или Session#load(), то вы можете перезагрузить состояние объекта, используя Session#refresh() или позвонив Session#clear(), чтобы полностью очиститьсессия.

9 голосов
/ 06 декабря 2014

Hibernate имеет два уровня кэширования,

  1. Кэш сеанса (кэш первого уровня) является кешем по умолчанию, и механизма для его отключения нет.

  2. Кэш уровня SessionFactory (второй уровень): мы должны настроить это в файле Hibernate cfg: настройка cache_provider.

    У меня было требование загружать тяжелые данные из БД, и я использовал сеанс без сохранения состояния из-за следующих функций.

     a. Stateless session does not support session cache and never interact with 
        second level cache.
     b. Stateless session does not support automatic dirty check.
     c. Stateless session does not support cascading to associated entities.
    

    Синтаксис для создания сеанса без сохранения состояния:

    StatelessSession statelessSession = sessionFactory.openStatelessSession();
    
7 голосов
/ 22 апреля 2012

Вы можете использовать:

session.setCacheMode(CacheMode.IGNORE)

после вашего:

session.createQuery("from Table") заявления.

Это гарантирует, что Hibernate невзаимодействовать с кэшем 2-го уровня для любой сущности, возвращаемой этим запросом.

4 голосов
/ 24 октября 2011
3 голосов
/ 01 августа 2013

Если вы создадите новый (другой) сеанс в вашем модульном тесте, он "не" будет использовать старый кеш. Или если вы сначала вызываете clear () (другой вариант) и т. Д.

0 голосов
/ 09 сентября 2016

После того, как вы в первый раз запросите результат, вызовите session.clear, и тогда тот же запрос попадет в базу данных, а не на кэш 1-го уровня

0 голосов
/ 30 сентября 2010

По словам парня из команды hibenrate:

Кэш второго уровня не имеет ничего общего с кэшем первого уровня (сессионный или постоянный контекст).Постоянный контекст / кэш сеанса является обязательным по разным причинам.На самом деле, не понимание этой важной части и игнорирование ее в архитектуре приложения - это путь к катастрофе.Здесь нет быстрого решения, изучите некоторую документацию.

Источник: https://forum.hibernate.org/viewtopic.php?p=2383408
Вы можете использовать seesion.evict (ваш объект), прежде чем повторить тот же запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...