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

Давай повернемося до наших параметрів кешування у файлі 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

2. Приклад налаштування 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"
/>

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

3. Аналіз статистики кешування

Так само у тебе може виникнути необхідність перевірити, наскільки добре налаштований механізм кешування. Спеціально для цього 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