Configuración del almacenamiento en caché

Volvamos a nuestra configuración de almacenamiento en caché en el archivo 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"/>

Preste atención a la primera línea: contiene el nombre de la clase de motor de almacenamiento en caché. Hibernate en realidad no implementa el almacenamiento en caché internamente, sino que proporciona un conjunto de interfaces con las que puede implementar su propio motor de almacenamiento en caché.

Las implementaciones populares incluyen:

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Se puede almacenar en caché en la memoria o en el disco, así como en el almacenamiento en caché del clúster, y también admite un caché opcional de resultados de consultas de Hibernate.

OSCache

Admite el almacenamiento en caché de memoria y disco en la misma JVM con un amplio conjunto de políticas de caducidad y soporte de caché de consultas.

SwarmCache

Caché de clúster basado en JGroups. Utiliza la invalidación en clúster, pero no es compatible con la caché de consultas de Hibernate.

Caché de JBoss

Un caché en clúster replicado completamente transaccional, también basado en la biblioteca de multidifusión JGroups. Admite replicación o invalidación, comunicación síncrona o asíncrona y bloqueo optimista y pesimista. Se admite la caché de consultas de Hibernate.

Estos motores no admiten todas las estrategias de acceso paralelo. La situación real se describe en la siguiente tabla:

Estrategia/Proveedor Solo lectura lectura-escritura no estricta leer escribir transaccional
EHCache X X X
OSCache X X X
SwarmCache X X
Caché de JBoss X X

Ejemplo de configuración de EHCache

El motor EHCache tiene su propio archivo de configuración llamado ehcache.xml. El contenido aproximado de dicho archivo:

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

Aquí puede configurar los ajustes de almacenamiento en caché tanto en general como para cada entidad por separado. Lea más en la documentación oficial .

Análisis de estadísticas de almacenamiento en caché

Es posible que también deba verificar qué tan bien está configurado el mecanismo de almacenamiento en caché. Hibernate proporciona un objeto especial de estadísticas específicamente para esto.

Ejemplo:

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

No entraremos en detalles sobre esto, porque pasarán muchos años antes de que se quede sin soluciones estándar de almacenamiento en caché y necesite mejorarlas manualmente. Por cierto, este comentario puede haber sido extraído de un caso similar:

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