Similar presentations:
Hibernate Cache
1.
Hibernate Cache2.
В Hibernate представлено 3 уровня кэширования1. Кэш первого уровня (Persistence context)
2. Кэш второго уровня (SessionFactory level)
3. Кэш запросов
3.
Entity state machine4.
Persistence Context● Persistence Context - следит за каждой “управляемой” сущностью.
● Кэш первого уровня включен по умолчанию, более того, его нельзя
выключить.
● Кэш первого уровня является локальным для Session, другие Session его
не увидят.
● Persistence Context может иметь 2 scope:
○
TRANSACTION
Жизненный цикл PC связан с транзакцией, используется по
умолчанию
○
EXTENDED Жизненный цикл PC привязан к stateful session bean ( bean that maintains
conversational state)
5.
Кэш второго уровня● Является глобальным кэшем (на уровне SessionFactory)
● Hibernate не предоставляет никакого in-memory кэша, а предоставляет
инфраструктуру для провайдера (EhCache)
● По умолчанию включен, но не работает, т.к. используется
NoCachingRegionFactory
6.
Минимальная конфигурацияДля того, чтобы hibernate включил кэш второго уровня, необходимо:
● Сконфигурировать RegionFactory - Класс ответственный за создание
регионов.
● Аннотировать сущности @Cacheable или @Cache, вторая имеет
несколько интересных атрибутов:
○ region - название региона, по умолчанию, имеет полное имя класса
сущности
○ include - определяет необходимо ли включать ленивые поля в кэш,
может принимать 2 значения (“all”/”not all”)
○ usage - определяет CacheConcurrencyStrategy
7.
Хранение сущностейПо умолчанию Hibernate хранит сущности в разобранном виде (hydrated
state).
id (первичный ключ) не хранится, (хранится, как часть кэш ключа)
@Transient поля не хранятся
Коллекции не хранятся (по умолчанию)
Базовые типы хранятся, как есть
Для ToOne ассоциаций хранится только id
8.
Что там с коллекциями?● Коллекции по умолчанию не кэшируются, мы должны отдельно
аннотировать их @Cache/@Cacheable
● Hibernate хранит коллекции в отдельных регионах, полное имя класса +
имя коллекции (можно сконфигурировать политику кэширования для
коллекций)
● Для коллекций ассоциаций (ToMany) хранятся только id => сущности,
которые хранятся в коллекциях также должны быть кэшируемы.
9.
несколько фактов о кэше второго уровня● Если мы меняем БД не средствами Hibernate, то кэш и бд будут не
консистенты.
● Если мы меняем сущность, то инвалидируется весь регион, которому
принадлежит эта сущность.
● Когда мы используем HQL, Хибернейт способен распарсить и
определить, какой регион необходимо инвалидировать => данные в
кэше будут консистентны с базой.
● Когда мы используем sql Хибернейт не может распарсить запрос и
инвалидирует весь кэш.
software