Setter opp caching

La oss gå tilbake til bufringsinnstillingene våre i hibernate.cfg.xml-filen:

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

Vær oppmerksom på den første linjen - den inneholder navnet på hurtigbuffermotorklassen. Hibernate implementerer faktisk ikke caching internt, i stedet gir det et sett med grensesnitt som du kan implementere din egen cachingmotor med.

Populære implementeringer inkluderer:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Den kan bufres i minnet eller på disk, så vel som i klyngebufring, og støtter også en valgfri hurtigbuffer for Hibernate-spørringsresultater.

OSCache

Støtter minne- og diskbufring i samme JVM med et rikt sett med utløpspolicyer og støtte for spørringsbuffer.

SwarmCache

Cluster cache basert på JGroups. Den bruker klynget ugyldiggjøring, men støtter ikke Hibernate-spørringsbufferen.

JBoss Cache

En fullstendig transaksjonell replikert clustered cache, også basert på JGroups multicast-bibliotek. Den støtter replikering eller ugyldiggjøring, synkron eller asynkron kommunikasjon, og optimistisk og pessimistisk låsing. Dvalesøkebuffer støttes.

Disse motorene støtter ikke alle parallelltilgangsstrategier. Den faktiske situasjonen er beskrevet i tabellen nedenfor:

Strategi/leverandør Skrivebeskyttet ikke-streng lese-skrive Les Skriv transaksjonelle
EHCache X X X
OSCache X X X
SwarmCache X X
JBoss Cache X X

Eksempel på EHCache-konfigurasjon

EHCache- motoren har sin egen konfigurasjonsfil kalt ehcache.xml. Det omtrentlige innholdet i en slik fil:

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

Her kan du konfigurere caching-innstillinger både generelt og for hver enhet separat. Les mer i den offisielle dokumentasjonen .

Analyse av caching-statistikk

Du må kanskje også sjekke hvor godt hurtigbuffermekanismen er konfigurert. Hibernate tilbyr et spesielt statistikkobjekt spesielt for dette.

Eksempel:

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

Vi vil ikke gå i detalj om dette, for det vil ta mange år til før du går tom for standard caching-løsninger og trenger å forbedre dem manuelt. Forresten, denne kommentaren kan ha blitt hentet fra en lignende sak:

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