Ответ
Hibernate предоставляет два основных уровня кэширования для оптимизации производительности.
1. Кэш первого уровня (L1) — Сессионный кэш
- Область видимости: Привязан к объекту
Session(т.е., к одному потоку/транзакции). - Статус: Включен по умолчанию, отключить его нельзя.
- Как работает: Hibernate хранит здесь все загруженные в данной сессии сущности. Повторный запрос по идентификатору в рамках той же сессии не приводит к SQL-запросу.
- Жизненный цикл: Автоматически очищается при закрытии сессии (
session.close()).
Session session = sessionFactory.openSession();
// Первый get() выполняет SELECT
User user1 = session.get(User.class, 1L);
// Второй get() берет объект из кэша L1, SQL не выполняется
User user2 = session.get(User.class, 1L);
assert user1 == user2; // true - это один и тот же экземпляр (повторное использование)
session.close(); // Кэш L1 очищен
2. Кэш второго уровня (L2) — Кэш уровня фабрики сессий
- Область видимости: Распределен между всеми сессиями, созданными одной
SessionFactory. - Статус: Отключен по умолчанию. Требует явного включения и выбора провайдера (Ehcache, Infinispan, Hazelcast).
- Что кэширует: Может кэшировать сущности, коллекции и результаты запросов.
- Конфигурация: Настраивается аннотациями или XML.
@Entity
@Cacheable // Включает сущность для кэширования L2
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
// ...
}
// Сессия 1
Session s1 = sessionFactory.openSession();
Product p1 = s1.get(Product.class, 101L); // SQL -> БД, сохраняет в L1 и L2
s1.close();
// Сессия 2
Session s2 = sessionFactory.openSession();
Product p2 = s2.get(Product.class, 101L); // Берет из L2, SQL не выполняется!
s2.close();
Важное различие: Кэш запросов (Query Cache) — это отдельная функция L2, которую нужно включать отдельно (hibernate.cache.use_query_cache=true). Он кэширует результаты HQL/Criteria запросов с одинаковыми параметрами.
Итог: L1 — обязательный и автоматический, L2 — опциональный и мощный инструмент для снижения нагрузки на БД в многопользовательских приложениях.