Opzetten van caching

Laten we teruggaan naar onze caching-instellingen in het bestand 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"/>

Let op de eerste regel - deze bevat de naam van de cache-engineklasse. Hibernate implementeert caching niet echt intern, maar biedt een set interfaces waarmee u uw eigen caching-engine kunt implementeren.

Populaire implementaties zijn onder meer:

  • EHCache
  • OSCache
  • zwermcache
  • JBoss TreeCache

EHCache

Het kan in het geheugen of op schijf worden gecached, evenals in clustercaching, en ondersteunt ook een optionele cache van Hibernate-queryresultaten.

OSCache

Ondersteunt geheugen- en schijfcaching in dezelfde JVM met een uitgebreide reeks vervalbeleidsregels en ondersteuning voor querycache.

zwermcache

Clustercache gebaseerd op JGroups. Het maakt gebruik van geclusterde invalidatie, maar ondersteunt de Hibernate-querycache niet.

JBoss-cache

Een volledig transactionele gerepliceerde geclusterde cache, ook gebaseerd op de JGroups multicast-bibliotheek. Het ondersteunt replicatie of ongeldigverklaring, synchrone of asynchrone communicatie en optimistische en pessimistische vergrendeling. Hibernate query cache wordt ondersteund.

Deze engines ondersteunen niet alle parallelle toegangsstrategieën. De feitelijke situatie wordt beschreven in onderstaande tabel:

Strategie/aanbieder Alleen lezen niet-strikt lezen-schrijven lezen schrijven transactioneel
EHCache X X X
OSCache X X X
zwermcache X X
JBoss-cache X X

Voorbeeld van EHCache-configuratie

De EHCache- engine heeft zijn eigen configuratiebestand genaamd ehcache.xml. De geschatte inhoud van zo'n bestand:

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

Hier kunt u caching-instellingen configureren, zowel in het algemeen als voor elke entiteit afzonderlijk. Lees meer in de officiële documentatie .

Analyse van cachingstatistieken

Mogelijk moet u ook controleren hoe goed het caching-mechanisme is geconfigureerd. Speciaal hiervoor stelt Hibernate een speciaal Statistics-object ter beschikking.

Voorbeeld:

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

We zullen hier niet in detail op ingaan, omdat het nog vele jaren zal duren voordat je zonder standaard caching-oplossingen komt te zitten en deze handmatig moet verbeteren. Overigens kan deze opmerking uit een soortgelijke zaak zijn gehaald:

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