Middle
149
questionbank
Какие уровни кэширования существуют в Hibernate?
Ответ от нейросети
sobes.tech AI
Hibernate поддерживает три уровня кэширования:
-
Кэш первого уровня (Session Cache):
- Кэш ассоциации
Sessionс объектами. - По умолчанию включен.
- Жизненный цикл связан с жизнью объекта
Session. - Hibernate проверяет этот кэш перед выполнением запросов к базе данных.
- Если объект найден в кэше сессии, возвращается его копия без обращения к БД.
- Кэш ассоциации
-
Кэш второго уровня (SessionFactory Cache):
- Опциональный кэш, совместно используемый всеми
Session, созданными из одногоSessionFactory. - Требует явной конфигурации и выбора поставщика кэша (например, Ehcache, Infinispan).
- Хранит считанные из БД объекты, коллекции и результаты запросов.
- Значительно повышает производительность при частом чтении одних и тех же данных.
- Опциональный кэш, совместно используемый всеми
-
Кэш запросов (Query Cache):
- Опциональный кэш, хранящий не сами объекты, а результаты запросов (идентификаторы объектов).
- Требует включения как второго уровня кэширования, так и самого Query Cache.
- При выполнении запроса Hibernate проверяет, имеется ли уже кэшированный результат для этого запроса и его параметров.
- Если результат найден, Hibernate извлекает соответствующие объекты из кэша второго уровня или, при их отсутствии, из БД, используя кэшированные идентификаторы.
Конфигурация второго уровня кэширования в hibernate.cfg.xml:
<!-- Явное включение второго уровня кэширования -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<!-- Выбор провайдера кэша (например, Ehcache) -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- Включение кэша запросов -->
<property name="hibernate.cache.use_query_cache">true</property>
Аннотация для кэширования сущности:
@Entity
@Cacheable // Включает кэширование этой сущности
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // Стратегия параллельного доступа
public class User {
// ... поля
}
Стратегии параллельного доступа для кэша второго уровня:
| Стратегия | Описание |
|---|---|
NONE |
Кэширование отключено. |
READ_ONLY |
Данные никогда не модифицируются после кэширования. Самая быстрая. |
NONSTRICT_READ_WRITE |
Данные могут изменяться. Нет гарантии согласованности при одновременных изменениях из разных сессий. |
READ_WRITE |
Данные могут изменяться. Гарантируется согласованность. Использует блокировки. |
TRANSACTIONAL |
Данные могут изменяться. Гарантируется согласованность в рамках JTA транзакций. |