Настройка на кеширане

Нека се върнем към нашите настройки за кеширане във file 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 всъщност не прилага вътрешно кеширане, instead of това предоставя набор от интерфейси, с които можете да внедрите своя собствена машина за кеширане.

Популярните реализации включват:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Може да се кешира в памет or на диск, Howто и в кеширане на клъстер, а също така поддържа допълнителен кеш на резултатите от заявките на Hibernate.

OSCache

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

SwarmCache

Клъстерен кеш, базиран на JGroups. Той използва клъстерно обезсилване, но не поддържа кеша на заявките на Hibernate.

Кеш на JBoss

Напълно транзакционен репликиран клъстерен кеш, също базиран на JGroups multicast библиотека. Поддържа репликация or анулиране, синхронна or асинхронна комуникация и оптимистично и песимистично заключване. Поддържа се кеш на заявки за хибернация.

Тези машини не поддържат всички стратегии за паралелен достъп. Действителната ситуация е описана в tableта по-долу:

Стратегия/Доставчик Само за четене нестриктно четене-запис чети пиши транзакционен
EHCache х х х
OSCache х х х
SwarmCache х х
Кеш на JBoss х х

Пример за конфигурация на 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"
/>

Тук можете да конфигурирате настройките за кеширане Howто като цяло, така и за всеки обект поотделно. Прочетете повече в официалната documentация .

Анализ на статистиката за кеширане

Може също да се наложи да проверите колко добре е конфигуриран механизмът за кеширане. 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);

Няма да навлизаме в подробности за това, защото ще минат още много години, преди да изчерпите стандартните решения за кеширане и да трябва да ги подобрите ръчно. Между другото, този коментар може да е извлечен от подобен случай:

// Dear programmer:
// When you're done "optimizing" this routine
// and realize how big of a mistake it was to do this,
// please increment the counter at the bottom as a warning
// for the next guy:
// number_of_hours_spent_here = 42