Настройка кэширования

Давай вернемся к нашим настройкам кеширования в файле hibernate.cfg.xml:

<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletEhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

Обрати внимание на первую строку — в ней указано имя класса движка кэширования. На самом деле Hibernate не реализует кэширование у себя внутри, вместо этого он предоставляет набор интерфейсов, с помощью которых можно реализовать свой собственный движок кеширования.

Из популярных реализаций можно выделить следующие:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Он может кэшироваться в памяти или на диске, а также в кластерном кэшировании, а также поддерживает дополнительный кэш результатов запроса Hibernate.

OSCache

Поддерживает кэширование в память и на диск в одной JVM с богатым набором политик истечения срока действия и поддержкой кэша запросов.

SwarmCache

Кластерный кэш на основе JGroups. Он использует кластеризованное аннулирование, но не поддерживает кэш запросов Hibernate.

JBoss Cache

Полностью транзакционный реплицируемый кластерный кэш, также основанный на многоадресной библиотеке JGroups. Он поддерживает репликацию или аннулирование, синхронную или асинхронную связь, а также оптимистическую и пессимистическую блокировки. Кэш запросов Hibernate поддерживается.

Эти движки поддерживают не все стратегии параллельного доступа. Реальная ситуация описана в таблице ниже:

Strategy/Provider Read-only Nonstrict read-write Read-write Transactional
EHCache X X X
OSCache X X X
SwarmCache X X
JBoss Cache X X

Пример настройки EHCache

Движок EHCache имеет свой собственный конфигурационный файл, который называется ehcache.xml. Примерное содержание такого файла:


<diskStore path="java.io.tmpdir"/>
 
<defaultCache
    maxElementsInMemory = "1000"
    eternal = "false"
    timeToIdleSeconds = "120"
    timeToLiveSeconds = "120"
    overflowToDisk = "true"
/>
 
<cache name = "Employee"
    maxElementsInMemory = "500"
    eternal = "true"
    timeToIdleSeconds = "0"
    timeToLiveSeconds = "0"
    overflowToDisk = "false"
/>

Тут ты можешь настроить параметры кэширования как в целом, так и для каждой сущности отдельно. Более подробно читай в официальной документации.

Анализ статистики кэширования

Так же у тебя может возникнуть необходимость проверить, насколько хорошо настроен механизм кэширования. Специально для этого Hibernate предоставляет специальный объект Statistics.

Пример:


Statistics statistics = session.getSessionFactory().getStatistics();
CacheRegionStatistics cacheStatistics = statistics.getDomainRegionStatistics(“com.javarush.employee”);
 
long hitCount = cacheStatistics.getHitCount();
long missCount = cacheStatistics.getMissCount();
double hitRatio = (double) hitCount / (hitCount + missCount);

Детально мы это разбирать не будем, потому что пройдет еще много лет, прежде чем тебе не хватит стандартных решений кэширования и понадобится улучшить их вручную. Кстати, возможно, именно из похожего случая был извлечен этот комментарий:


// Дорогой программист:
// Когда ты закончишь “оптимизировать” эту подпрограмму
// и поймешь, насколько большой ошибкой было делать это,
// пожалуйста, увеличь счетчик внизу как предупреждение
// для следующего парня:
// количество_часов_потраченных_здесь = 42
undefined
1
Задача
Модуль 4. Работа с БД, 14 уровень, 7 лекция
Недоступна
task1407
Дан файл ehcache.xml. Добавь в него кастомную настройку для энтити Employee, с такими атрибутами...