JavaRush /Курсы /Модуль 4. Работа с БД /Настройка движка кэширования

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

Модуль 4. Работа с БД
14 уровень , 7 лекция
Открыта

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

Давай вернемся к нашим настройкам кеширования в файле 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
1
Задача
Модуль 4. Работа с БД, 14 уровень, 7 лекция
Недоступна
task1407
Дан файл ehcache.xml. Добавь в него кастомную настройку для энтити Employee, с такими атрибутами...
Комментарии (8)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Олег Уровень 106 Expert
16 октября 2024
Совсем тяжко
Павел Уровень 19 Expert
2 апреля 2024
ChatGpt подсказал мне: В Hibernate версии 5.x конфигурация кэша немного отличается от предыдущих версий. Вместо использования hibernate.cache.provider_class, вы должны использовать hibernate.cache.region.factory_class, чтобы указать фабрику регионов кэша. (Это как у меня в Intellij)
aDuVaN4Ik Уровень 42
21 января 2023
// Дорогой программист: // Когда ты закончишь “изучать” эту тему оптимизации // и поймешь, насколько тяжело было делать это, // пожалуйста, увеличь счетчик внизу как количество людей пострадавших на этом // для всех кто прошел уважуха : // количество_людей_пострадавших_здесь = 1
Александр Уровень 111 Expert
4 февраля 2023
А в чем страдание? Вроде все по факту описано, создать некую политику для энтити. Другое дело это, если сидеть разбираться, что, за что отвечает и в каких ситуациях это может понадобиться.
aDuVaN4Ik Уровень 42
12 февраля 2023
Кому как. Если в будущем твоя работа будет только сидеть и делать так как ты видел то вопросов ноль. Но если ты хочешь разобраться в этой теме то придется настрадаться. Возможно ты такой удачливый человек что за весь путь обучения у тебя решение ошибок компиляции занимало только несколько часов. Для меня изучение новой темы это значит готовиться решать ошибки решение которых займет 1-3 дня минимум. В общем у каждого свой порог входа в тему так что спорить безполезно.
Александр Уровень 111 Expert
13 февраля 2023
Все ок, я тебя прекрасно понимаю. Я настрадался и до сих пор страдаю. Иногда даже самые простые вещи отказываются работать так как ты этого хочешь или ожидаешь.
PapaEmiritus Уровень 45
31 октября 2023
главное двигаться вперед и не сдаваться!!!
Руслан Никитин Уровень 109
6 февраля 2025
продолжаем страдать 😁