Cache De Hibernate

De Dos Ideas.
Revisión del 22:07 8 jul 2011 de 89.135.83.116 (discusión) (Cache de Segundo Nivel)
Saltar a: navegación, buscar

Uso y configuración de la funcionalidad de cache en Hibernate.

Generalmente todos los cache se basan en almacenar objetos en memoria para acelerar accesos posteriores, pero debemos aclarar que en Hibernate hay dos tipos de cache: el Primer Nivel y el Segundo Nivel.

Whoa, things just got a whole lot esaier.

God help me, I put aside a whole afternoon to fgirue this out.

Query Cache

Para mejorar la performance y rendimiento de las aplicaciones podemos utilizar Query Cache.

Si lo que interesa es "cachear" el resultado exacto de una consulta, no objetos individuales. Por ejemplo, si tenemos un método en un DAO que retorna la lista de Paises registrados en la base de datos, es muy probable que siempre retorne el mismo resultado ya que esa tabla no cambia a menudo, entonces es recomendable establecer la consulta como "cacheable".

Hay que tener en cuenta que el query cache solo almacena los identificadores de los objetos del resultado, es decir que lo debemos usar combinado con el Cache de Segundo Nivel. Los pasos serían:

  1. Establecer el property hibernate.cache.use_query_cache=true en el hibernate.cfg.xml
  2. Configurar la entidad Pais como "cacheable"
  3. Establecer la consulta como "cacheable":

 List paises = sess.createQuery("from Pais")
                             .setCacheable(true)
                             .list();

Por lo tanto, la primera vez que se ejecuta la consulta, se retorna la lista de Paises desde la tabla mediante un select, pero a partir de ese momento toda vez que se repita el query, el resultado va a ser retornado desde el cache, evitando la comunicación con la base de datos.

¿Que pasa si agrego un nuevo Pais?

Entonces el query dejaría de ser válido, solo si agregamos un nuevo Pais pasando por la session de Hibernate, el query se invalida automáticamente para que la próxima vez que se ejecute la consulta vuelva a obtener el resultado desde la base de datos. Es importante aclarar que el comportamiento anterior no se cumple si se inserta un Pais por afuera del aplicativo, es decir con un insert directo a la tabla, o si se tiene dos aplicativos separados que apuntan a la misma base de datos, en ese caso habría que usar JNDI para que todos compartan la misma SessionFactory.

Es recomendable usar el query cache solo en los casos en que una consulta se repite constantemente y la entidad resultado no cambia frecuentemente, por ejemplo: Países, Provincias, etc.

Ver también