Налаштування кешування

Повернімося до наших налаштувань кешування у файлі 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.codegym.employee”);

long hitCount = cacheStatistics.getHitCount();
long missCount = cacheStatistics.getMissCount();
double hitRatio = (double) hitCount / (hitCount + missCount);

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

// Дорогий програміст:
// Коли ти закінчиш оптимізувати цю підпрограму
// і зрозумієш, наскільки великою помилкою було робити це,
// будь ласка, збільши лічильник внизу як попередження
// для наступного хлопця:
// кількість_годин_витрачених_тут = 42