junior
Что такое кэш второго уровня (L2 Cache)?
Кэш второго уровня (L2 Cache) — опциональный кэш, разделяемый между всеми Session в рамках одного SessionFactory. В отличие от L1, хранит данные между транзакциями.
Архитектура кэширования
Пример
Session 1 → L1 Cache ─┐
Session 2 → L1 Cache ──┤──→ L2 Cache ──→ БД
Session 3 → L1 Cache ─┘
Поиск сущности: L1 Cache → L2 Cache → БД
Настройка L2 Cache с Ehcache
Пример
<!-- pom.xml -->
<dependency>
<groupId>org.hibernate.orm</groupId>
<artifactId>hibernate-jcache</artifactId>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
Пример
# application.properties
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=jcache
spring.jpa.properties.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider
Пример
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Department {
@Id
private Long id;
private String name;
}
Стратегии конкурентного доступа
| Стратегия | Описание | Применение |
|---|---|---|
| READ_ONLY | Только чтение, данные не меняются | Справочники, словари |
| NONSTRICT_READ_WRITE | Чтение/запись без строгой согласованности | Редко обновляемые данные |
| READ_WRITE | Чтение/запись с мягкими блокировками | Часто читаемые, редко обновляемые |
| TRANSACTIONAL | Полная транзакционная согласованность (JTA) | Критичные данные |
Важное
- L2 Cache — опциональный, разделяемый между всеми Session
- Кэшируются данные (не объекты) — при чтении из L2 создаётся новый Java-объект
- L2 Cache эффективен для часто читаемых, редко обновляемых данных (справочники, каталоги)
- Провайдеры: Ehcache, Caffeine (через JCache), Infinispan, Hazelcast
Частые ошибки
- Кэшировать часто обновляемые данные — L2 Cache добавит overhead на инвалидацию без выигрыша
- Не кэшировать коллекции — даже если сущность в кэше, её коллекции нужно кэшировать отдельно (
@Cacheна коллекции) - Забыть про инвалидацию при прямом SQL — native queries и bulk operations обходят L2 Cache
- L2 Cache в кластере без распределённого кэша — каждый узел имеет свою копию, данные расходятся
Как используется в 2026
- L2 Cache используется для справочных данных (страны, категории, настройки)
- Для distributed кэширования — Redis/Hazelcast вместо локального Ehcache
- Тренд: кэширование на уровне сервиса (Spring Cache + Redis) вместо L2 Cache Hibernate
- L2 Cache остаётся полезным для монолитов; в микросервисах — Spring Cache предпочтительнее
На собеседовании: отличайте L1 от L2: L1 — обязательный, привязан к Session/транзакции; L2 — опциональный, общий для всех Session. Упомяните стратегии конкурентного доступа (READ_ONLY для справочников). Частый подвох — «а что будет при native SQL?» — L2 Cache не инвалидируется автоматически.