Использовался ли кэш второго уровня Hibernate в вашем проекте?

«Использовался ли кэш второго уровня Hibernate в вашем проекте?» — вопрос из категории Hibernate, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, мы использовали кэш второго уровня (L2 Cache) с провайдером Ehcache для снижения нагрузки на базу данных и повышения производительности read-heavy операций.

Зачем это нужно? Кэш второго уровня работает на уровне сессии (SessionFactory) и позволяет разделять кэшированные данные между разными сессиями Hibernate, что эффективно для часто читаемых и редко изменяемых сущностей.

Пример настройки в persistence.xml:

<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" 
          value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
<!-- Включение кэша для запросов -->
<property name="hibernate.cache.use_query_cache" value="true"/>

Пример аннотирования сущности:

@Entity
@Cacheable // JPA-аннотация
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class Product {
    @Id
    private Long id;
    private String name;
    // ...
}

Важные моменты:

  • Необходимо выбирать правильную стратегию параллельного доступа (READ_ONLY, READ_WRITE, NONSTRICT_READ_WRITE).
  • Кэш запросов (query cache) требует осторожности, так как инвалидируется при изменении данных в затронутых таблицах.
  • Для распределенных систем часто используют Hazelcast или Infinispan вместо Ehcache.