Opsætning af caching

Lad os gå tilbage til vores caching-indstillinger 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 opmærksom på den første linje - den indeholder navnet på caching-motorklassen. Hibernate implementerer faktisk ikke caching internt, i stedet giver det et sæt grænseflader, som du kan implementere din egen cachingmotor med.

Populære implementeringer inkluderer:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Det kan cachelagres i hukommelsen eller på disk, såvel som i klyngecache, og understøtter også en valgfri cache med Hibernate-forespørgselsresultater.

OSCache

Understøtter hukommelse og diskcache i samme JVM med et rigt sæt udløbspolitikker og understøttelse af forespørgselscache.

SwarmCache

Cluster cache baseret på JGroups. Den bruger klyngede invalidering, men understøtter ikke Hibernate-forespørgselscachen.

JBoss Cache

En fuldt transaktionel replikeret klynget cache, også baseret på JGroups multicast-bibliotek. Det understøtter replikering eller invalidering, synkron eller asynkron kommunikation og optimistisk og pessimistisk låsning. Dvale forespørgselscache understøttes.

Disse motorer understøtter ikke alle parallelle adgangsstrategier. Den faktiske situation er beskrevet i nedenstående tabel:

Strategi/Udbyder Læs kun ikke-streng læse-skrive læse skrive transaktionelle
EHCache x x x
OSCache x x x
SwarmCache x x
JBoss Cache x x

EHCache-konfigurationseksempel

EHCache- motoren har sin egen konfigurationsfil kaldet ehcache.xml. Det omtrentlige indhold af en sådan 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-indstillinger både generelt og for hver enhed separat. Læs mere i den officielle dokumentation .

Analyse af caching-statistik

Du skal muligvis også kontrollere, hvor godt caching-mekanismen er konfigureret. Hibernate giver et særligt statistikobjekt specifikt til 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 detaljer om dette, for der vil gå mange år endnu, før du løber tør for standard caching-løsninger og skal forbedre dem manuelt. Forresten kan denne kommentar være uddraget fra en lignende sag:

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