Gymterview
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 не инвалидируется автоматически.