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
GO TO FULL VERSION