En ciertos casos, nos interesa cachear el resultado exacto de una consulta, no objetos individuales. Esto sería util cuando realizemos consultas cuyo resultado varíe muy poco, entonces es recomendable establecer la consulta como "cacheable".
Hay que tener en cuenta que el query cache solo almacena los id's de los objetos del resultado, es decir que lo debemos usar combinado con el Second Level Cache.
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.
Su uso representa otra opción para mejorar la performance y rendimiento de nuestras aplicaciones.
Supongamos la consulta:
List monedas = sess.createQuery("from Moneda")
Aqui establecemos la consulta como cacheable
.setCacheable(true) <--.list();
La primera vez que se ejecuta la consulta, retornará 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.¿Que pasa si se agrega una nueva Moneda?
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.
Si agregamos una nueva Moneda por fuera de ESA session, el query no se invalida; sería lo mismo que hacer un insert directo a la tabla, entonces habría que usar JNDI para que todos compartan la misma SessionFactory.
Entonces para el ejemplo que venimos manejando, hay que realizar los siguientes pasos:
- Establecer el property hibernate.cache.use_query_cache=true en el hibernate.cfg.xml
- Configurar la entidad Moneda como cacheable