Как отключить кэширование спящего режима

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

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

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

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

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

Спящий режим имеет два уровня кэша,

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

  • Кэш уровня SessionFactory (второго уровня): мы должны настроить это в файле cfg Hibernate на  установка 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();
    

Ответ 3

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

session.setCacheMode(CacheMode.IGNORE)

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

session.createQuery("from Table").

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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