Sobes.tech
Middle
149
questionbank

Какие уровни кэширования существуют в Hibernate?

Ответ от нейросети

sobes.tech AI

Hibernate поддерживает три уровня кэширования:

  1. Кэш первого уровня (Session Cache):

    • Кэш ассоциации Session с объектами.
    • По умолчанию включен.
    • Жизненный цикл связан с жизнью объекта Session.
    • Hibernate проверяет этот кэш перед выполнением запросов к базе данных.
    • Если объект найден в кэше сессии, возвращается его копия без обращения к БД.
  2. Кэш второго уровня (SessionFactory Cache):

    • Опциональный кэш, совместно используемый всеми Session, созданными из одного SessionFactory.
    • Требует явной конфигурации и выбора поставщика кэша (например, Ehcache, Infinispan).
    • Хранит считанные из БД объекты, коллекции и результаты запросов.
    • Значительно повышает производительность при частом чтении одних и тех же данных.
  3. Кэш запросов (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 транзакций.