Configurarea memoriei cache

Să revenim la setările noastre de cache din fișierul 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"/>

Fiți atenți la prima linie - conține numele clasei de motor de stocare în cache. Hibernate nu implementează de fapt memorarea în cache în interior, ci oferă un set de interfețe cu care puteți implementa propriul motor de stocare în cache.

Implementările populare includ:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Poate fi stocat în cache în memorie sau pe disc, precum și în cache în cluster și acceptă, de asemenea, un cache opțional al rezultatelor interogării Hibernate.

OSCache

Acceptă memoria cache și discul în același JVM cu un set bogat de politici de expirare și suport pentru interogare cache.

SwarmCache

Cache-ul cluster bazat pe JGroups. Utilizează invalidarea în cluster, dar nu acceptă cache-ul de interogări Hibernate.

JBoss Cache

Un cache cluster replicat complet tranzacțional, bazat și pe biblioteca multicast JGroups. Acceptă replicarea sau invalidarea, comunicarea sincronă sau asincronă și blocarea optimistă și pesimistă. Cache-ul de interogări Hibernare este acceptat.

Aceste motoare nu acceptă toate strategiile de acces paralel. Situația reală este descrisă în tabelul de mai jos:

Strategie/Furnizor Numai citire non-strict citire-scriere Citeste, scrie tranzacționale
EHCache X X X
OSCache X X X
SwarmCache X X
JBoss Cache X X

Exemplu de configurare EHCache

Motorul EHCache are propriul fișier de configurare numit ehcache.xml. Conținutul aproximativ al unui astfel de fișier:

<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"
/>

Aici puteți configura setările de cache atât în ​​general, cât și pentru fiecare entitate separat. Citiți mai multe în documentația oficială .

Analiza statisticilor de caching

De asemenea, poate fi necesar să verificați cât de bine este configurat mecanismul de cache. Hibernate oferă un obiect Statistics special special pentru aceasta.

Exemplu:

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);

Nu vom intra în detalii despre acest lucru, deoarece vor mai dura mulți ani până când veți rămâne fără soluții standard de cache și trebuie să le îmbunătățiți manual. Apropo, acest comentariu poate fi extras dintr-un caz similar:

// 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