Middle
84
questionbank
Что такое кэширование в Hibernate?
Ответ от нейросети
sobes.tech AI
Кэширование в Hibernate — это механизм хранения данных в памяти для сокращения количества запросов к базе данных, что повышает производительность приложения.
Hibernate поддерживает три уровня кэширования:
-
Кэш первого уровня (First-Level Cache):
- Включен по умолчанию и связан с объектом
Session. - Кэширует объекты, загруженные в рамках текущей сессии.
- Объекты удаляются из кэша при закрытии сессии.
- Включен по умолчанию и связан с объектом
-
Кэш второго уровня (Second-Level Cache):
- Общий для нескольких сессий (
SessionFactory). - Требует явной настройки и выбора поставщика кэша (например, Ehcache, Infinispan).
- Позволяет кэшировать данные объектов, запросов и коллекций.
- Общий для нескольких сессий (
-
Кэш запросов (Query Cache):
- Кэширует результаты запросов и параметры их выполнения.
- Работает в связке с кэшем второго уровня, сохраняя идентификаторы объектов из результатов запросов.
- Требует явного включения для каждого запроса.
Пример включения кэша второго уровня для сущности и запроса:
// Аннотация для Entity
@Entity
@Cacheable // Включение кэширования
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // Стратегия управления кэшем
public class User {
// ... поля сущности
}
// Включение кэша для запроса
Query query = session.createQuery("FROM User WHERE isActive = :active");
query.setParameter("active", true);
query.setCacheable(true); // Включение кэширования для запроса
List<User> activeUsers = query.list();
Стратегии управления параллельным доступом для кэша второго уровня:
| Стратегия | Описание |
|---|---|
NONE |
Кэширование отключено. |
READ_ONLY |
Используется для данных, которые не изменяются. Быстрая. |
NONSTRICT_READ_WRITE |
Подходит для данных, которые редко изменяются. Нет блокировок при чтении. |
READ_WRITE |
Подходит для данных, которые часто изменяются. Требует записи блокировок. |
TRANSACTIONAL |
Используется для данных в транзакционно-безопасной среде. |