Налаштування кешування
Повернімося до наших налаштувань кешування у файлі 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
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ