2011-06-20 16 views
13

que han estado considerando la implementación de Ehcache en mis Grails objetos de dominio como esto:almacenamiento en caché los objetos de dominio en Grails

static mapping = { 
    cache true 
} 

No estoy muy familiarizado con exactamente cómo funciona este mecanismo de almacenamiento en caché y se preguntaba lo que una buena regla de oro es determinar qué objetos de dominio se beneficiarían de ser almacenados en caché. por ejemplo, objetos a los que se accede rara vez ... ¿a menudo ...?

Gracias!

Respuesta

27

El almacenamiento en caché solo funciona para las llamadas get() de forma predeterminada, pero las consultas utilizan la caché de consultas si las actualiza con cache: true (criterios y HQL).

cache true crea una caché de lectura y escritura, pero se puede configurar una memoria caché de sólo lectura con

static mapping = { 
    cache usage:'read-only' 
} 

El caché de sólo lectura es buena para los datos de búsqueda que nunca cambia, por ejemplo, estados, países, papeles, etc.

Si tiene clases de dominio que actualizan, crean o eliminan con frecuencia, el almacenamiento en caché de consultas a menudo será más lento que el almacenamiento en caché. Esto se debe a que los cambios como estos hacen que se borren todas las consultas almacenadas en la memoria caché, por lo que a menudo va directamente a la base de datos. Ver http://tech.puredanger.com/2009/07/10/hibernate-query-cache/ para una descripción más detallada de esto. Por esta razón, rara vez utilizan el almacenamiento en caché de consulta y, a menudo desactivarlo por completo con clases

hibernate { 
    cache.use_second_level_cache=true 
    cache.use_query_cache=false 
    cache.provider_class='org.hibernate.cache.EhCacheProvider' 
} 

de dominio que son "lectura en su mayoría" son los mejores candidatos para el almacenamiento en caché de lectura y escritura. Las memorias caché se borran para cada actualización, creación y eliminación, pero si son algo poco comunes, verá un aumento en el rendimiento general.

Hibernate tiene una API para controlar el uso de la memoria caché. Los complementos http://grails.org/plugin/app-info y http://grails.org/plugin/hibernate-stats hacen que la información esté disponible y puede usar el enfoque allí en su propio código.

+0

Gracias! Gran explicación – RyanLynch

+1

¿Hay alguna manera de obtener el tiempo de espera y volver a leer el caché? Es decir. especificar un max-age? El almacenamiento en caché de Grails parece ser muy muy básico. Veo que hay una serie de complementos de ehcache, incluido el "Complemento Ehcache Cache soportado por Pivotal", pero no está claro cómo esto interactuará o interferirá con Grails construido en caché de dominio a través de hibernación a través de su caché (que también parece ser ehcache). –

+1

Hey Burt, ¿es posible segregar la memoria caché de dominio a través de las regiones de hibernación? Esto significa que una actualización en un dominio no da como resultado la eliminación de la caché de consultas de todos los demás dominios. –

Cuestiones relacionadas