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