Ställer in caching

Låt oss gå tillbaka till våra cachningsinställningar i filen 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"/>

Var uppmärksam på den första raden - den innehåller namnet på cachingmotorklassen. Hibernate implementerar faktiskt inte cachning internt, istället tillhandahåller det en uppsättning gränssnitt som du kan implementera din egen cachingmotor med.

Populära implementeringar inkluderar:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Den kan cachelagras i minnet eller på disken, såväl som i klustercachelagring, och stöder även en valfri cache med frågeresultat från Hibernate.

OSCache

Stöder minne och diskcache i samma JVM med en rik uppsättning utgångspolicyer och stöd för frågecache.

SwarmCache

Clustercache baserat på JGroups. Den använder klustrad ogiltigförklaring men stöder inte frågecachen för viloläge.

JBoss Cache

En helt transaktionell replikerad klustrad cache, också baserad på JGroups multicast-bibliotek. Den stöder replikering eller ogiltigförklaring, synkron eller asynkron kommunikation och optimistisk och pessimistisk låsning. Viloläge frågecache stöds.

Dessa motorer stöder inte alla parallella åtkomststrategier. Den faktiska situationen beskrivs i tabellen nedan:

Strategi/leverantör Skrivskyddad icke-strikt läs-skriv läsa skriva transaktionella
EHCache X X X
OSCache X X X
SwarmCache X X
JBoss Cache X X

EHCache-konfigurationsexempel

EHCache -motorn har sin egen konfigurationsfil som heter ehcache.xml. Det ungefärliga innehållet i 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"
/>

Här kan du konfigurera cachinginställningar både generellt och för varje enhet separat. Läs mer i den officiella dokumentationen .

Analys av cachningsstatistik

Du kan också behöva kontrollera hur väl cachningsmekanismen är konfigurerad. Hibernate tillhandahåller ett speciellt statistikobjekt specifikt för detta.

Exempel:

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 kommer inte att gå in på detaljer om detta, eftersom det kommer att dröja många år till innan du får slut på vanliga cachelösningar och behöver förbättra dem manuellt. Förresten, den här kommentaren kan ha hämtats från ett liknande fall:

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