Hibernate поддерживает три уровня кэширования:
-
Кэш первого уровня (Session Cache):
- Кэш ассоциации
Session с объектами.
- По умолчанию включен.
- Жизненный цикл связан с жизнью объекта
Session.
- Hibernate проверяет этот кэш перед выполнением запросов к базе данных.
- Если объект найден в кэше сессии, возвращается его копия без обращения к БД.
-
Кэш второго уровня (SessionFactory Cache):
- Опциональный кэш, совместно используемый всеми
Session, созданными из одного SessionFactory.
- Требует явной конфигурации и выбора поставщика кэша (например, Ehcache, Infinispan).
- Хранит считанные из БД объекты, коллекции и результаты запросов.
- Значительно повышает производительность при частом чтении одних и тех же данных.
-
Кэш запросов (Query Cache):
- Опциональный кэш, хранящий не сами объекты, а результаты запросов (идентификаторы объектов).
- Требует включения как второго уровня кэширования, так и самого Query Cache.
- При выполнении запроса Hibernate проверяет, имеется ли уже кэшированный результат для этого запроса и его параметров.
- Если результат найден, Hibernate извлекает соответствующие объекты из кэша второго уровня или, при их отсутствии, из БД, используя кэшированные идентификаторы.
Конфигурация второго уровня кэширования в hibernate.cfg.xml:
xml
Аннотация для кэширования сущности:
java
Стратегии параллельного доступа для кэша второго уровня:
| Стратегия | Описание |
|---|
NONE | Кэширование отключено. |
READ_ONLY | Данные никогда не модифицируются после кэширования. Самая быстрая. |
NONSTRICT_READ_WRITE | Данные могут изменяться. Нет гарантии согласованности при одновременных изменениях из разных сессий. |
READ_WRITE | Данные могут изменяться. Гарантируется согласованность. Использует блокировки. |
TRANSACTIONAL | Данные могут изменяться. Гарантируется согласованность в рамках JTA транзакций. |