Hibernate Cache Reference - PullRequest
       4

Hibernate Cache Reference

9 голосов
/ 31 января 2011

Я ищу простой, полный и краткий список кэшей, с которыми вы столкнетесь при кодировании JPA с помощью Hibernate.

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

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

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

Ответы [ 2 ]

20 голосов
/ 31 января 2011

Кэш уровня изоляции

Сводка: Этот кэш иногда на самом деле не называют кешем.Однако для реализации определенных уровней изоляции сама база данных может кэшировать некоторые результаты запроса.

Жизненный цикл / область действия: Этот кэш ограничен одним Session / EntityManager.Жизненный цикл связан с жизненным циклом транзакции.

Очистка кеша: Не знаю другого способа, кроме начала новой транзакции

Что кэшируется: Запросы и результат (если изоляция имеет повторяемый уровень чтения или сериализуемый уровень)

Включен по умолчанию: Зависит от уровня изоляции по умолчанию, который поступает из базы данных.По умолчанию MySQL поставляется с повторяемой изоляцией чтения, и поэтому да, по умолчанию он включен для MySQL.

Включение / выключение: Может быть указано при создании транзакции.Также может быть изменено путем изменения значения по умолчанию для базы данных.

Полезная информация: Hibernate / JPA на самом деле не имеет никакого контроля над работой этого кэша, кроме указания того, какой уровень изоляции являетсятребуемый.

Кэш уровня сеанса (1-й уровень)

Сводка: Этот кэш является кэшем EntityManager / Session.Я полагаю, что это также то, что называется постоянным контекстом.

Жизненный цикл / область действия: Этот кэш ограничен одним Session / EntityManager.Жизненный цикл привязан к жизненному циклу транзакции.

Очистка кэша: Вызов clear() в EntityManager или Session очищает весь кэш.Вызов evict() в сеансе очищает один объект из кэша.

Что кэшируется: Все

Вкл по умолчанию: Да

Включение / выключение: Невозможно отключить

Полезная информация: Этот кэш объединяется с базой данных, когда flush()называется.Если это не произойдет, другие транзакции не смогут видеть вещи в этом кэше.Лучший способ гарантировать flush() - это зафиксировать транзакцию.

Кэш 2-го уровня

Сводка: Это дополнительный кэш, который можно включить (обычнопопытаться улучшить производительность).

Жизненный цикл / Область действия: Я считаю, что это связано с EntityManagerFactory / SessionFactory.Автоматическое удаление этого кэша зависит от стратегии кэширования.В стратегии только для чтения данные никогда не удаляются автоматически.В стратегии чтения-записи или нестрогого чтения-записи данные будут исключены при закрытии сеанса. Не уверен на 100%.

Очистка кеша: Вы можете позвонить getCache().evict(class), чтобы выселить определенный класс, и getCache().evictAll(), чтобы выселить весь кеш.Эти методы находятся в EntityManagerFactory.

Что кэшируется: Вы явно указываете, какие объекты должны кэшироваться.

Включено по умолчанию: Нет

Включение / выключение: Включение / выключение в конфигурации Hibernate

Полезная информация:

Кэш запросов

Сводка: Query Cache - это кэш, в котором хранятся запросы, параметры запроса и результаты.Если запрос и параметры запроса совпадают, вы можете ожидать, что результат будет одинаковым.

Жизненный цикл / область действия: Я понятия не имею, когда данные в этом кэше определены как устаревшие.Я считаю, что область действия находится на уровне EntityManagerFactory / SessionFactory.Кроме того, Hibernate хранит список меток времени «Последнее обновление от Hibernate» для каждой из таблиц.Hibernate использует эти временные метки, чтобы определить, являются ли результаты запроса устаревшими, и автоматически удалять устаревшие запросы.

Очистка кэша: Метод evictQueries() в SessionFactory можно использовать для ручного удаления кэша запросов..

Что кэшируется: Запросы и их результаты

По умолчанию включено: Нет

Включение / выключение: Включение / выключение в конфигурации Hibernate

Полезная информация: Кэш запросов кэширует только идентификаторы сущностей.Он должен использоваться вместе с кешем 2-го уровня для достижения true (без доступа к БД).

4 голосов
/ 31 января 2011

Дополнения / исправления:

(в 2L Cache) Жизненный цикл / Область: Я считаю, что это связано с EntityManagerFactory / SessionFactory.Я не знаю, когда удаляются старые данные.

Этот кеш делегируется специализированному провайдеру кеша, такому как Infinispan или EhCache.Таким образом, выселение настраивается / запрашивается вами, но выполняется поставщиком кэша.

(в кеше 2L) Что кэшируется: Все

Вам необходимо явно указатьHibernate какие объекты вы хотите кэшировать.

(кэш запросов) Сводка. Это еще один дополнительный кэш, который можно включить (обычно для повышения производительности).

Кэш запросов - это кэш, в котором хранятся запросы., параметры запроса и результаты.Если запрос и параметры запроса совпадают, вы можете ожидать, что результат будет одинаковым.Конечно, существуют методы аннулирования кэша, такие как «аннулирование кэша, если это обновление коснулось таблицы X», чтобы кэш не устаревал.

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