Кэш уровня изоляции
Сводка: Этот кэш иногда на самом деле не называют кешем.Однако для реализации определенных уровней изоляции сама база данных может кэшировать некоторые результаты запроса.
Жизненный цикл / область действия: Этот кэш ограничен одним 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 (без доступа к БД).