Impostazione della memorizzazione nella cache

Torniamo alle nostre impostazioni di memorizzazione nella cache nel file 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"/>

Presta attenzione alla prima riga: contiene il nome della classe del motore di memorizzazione nella cache. Hibernate in realtà non implementa la memorizzazione nella cache internamente, ma fornisce invece un insieme di interfacce con le quali è possibile implementare il proprio motore di memorizzazione nella cache.

Le implementazioni popolari includono:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Può essere memorizzato nella cache in memoria o su disco, nonché nella cache del cluster e supporta anche una cache opzionale dei risultati delle query di ibernazione.

OSCache

Supporta la memoria e la memorizzazione nella cache del disco nella stessa JVM con un ricco set di criteri di scadenza e supporto della cache delle query.

SwarmCache

Cache cluster basata su JGroups. Utilizza l'invalidazione in cluster ma non supporta la cache delle query di Hibernate.

JBoss Cache

Una cache in cluster replicata completamente transazionale, anch'essa basata sulla libreria multicast di JGroups. Supporta la replica o l'invalidazione, la comunicazione sincrona o asincrona e il blocco ottimistico e pessimistico. La cache delle query di ibernazione è supportata.

Questi motori non supportano tutte le strategie di accesso parallelo. La situazione attuale è descritta nella tabella sottostante:

Strategia/fornitore Sola lettura lettura-scrittura non rigorosa leggere scrivere transazionale
EHCache X X X
OSCache X X X
SwarmCache X X
JBoss Cache X X

Esempio di configurazione di EHCache

Il motore EHCache ha il proprio file di configurazione chiamato ehcache.xml. Il contenuto approssimativo di tale file:

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

Qui puoi configurare le impostazioni di memorizzazione nella cache sia in generale che per ciascuna entità separatamente. Maggiori informazioni nella documentazione ufficiale .

Analisi delle statistiche di memorizzazione nella cache

Potrebbe anche essere necessario verificare quanto bene è configurato il meccanismo di memorizzazione nella cache. Hibernate fornisce uno speciale oggetto Statistics specifico per questo.

Esempio:

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

Non entreremo nei dettagli di questo, perché ci vorranno molti anni prima che le soluzioni standard di memorizzazione nella cache si esauriscano e sia necessario migliorarle manualmente. A proposito, questo commento potrebbe essere stato estratto da un caso simile:

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