Query Cache en Hibernate

En un post anterior comenté sobre la utilización del First Level y Second Level Cache en Hibernate, otra opción interesante para mejorar la performance y rendimiento de nuestras aplicaciones es el uso del Query Cache.

En ciertos casos, nos interesa "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 Monedas registradas 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 Second Level Cache.
Entonces para el ejemplo que venimos manejando, hay que realizar los siguientes pasos:
  1. Establecer el property hibernate.cache.use_query_cache=true en el hibernate.cfg.xml
  2. Configurar la entidad Moneda como "cacheable", según lo publicado anteriormente
  3. Establecer la consulta como "cacheable":
List monedas = sess.createQuery("from Moneda")
                            .setCacheable(true)
                            .list();
Por lo tanto, la primera vez que se ejecuta la consulta, se retorna la lista de Monedas 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.

Ustedes se preguntarán: ¿Que pasa si agrego una nueva Moneda? ¿El query dejaría de ser válido?

Si, así es, si agregamos una nueva Moneda 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 insertamos una Moneda por afuera del aplicativo, es decir con un insert directo a la tabla, o si tenemos 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.

Como habrán concluido, 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, Estados, Tipos y Monedas.

En mi opinión, éste tipo de configuraciones son las que hacen la diferencia a la hora de evaluar el rendimiento o evaluar la performance de los aplicativos desarrollados con Hibernate.

No hay comentarios.: