2010-05-06 19 views
9

Estoy creando un servicio que tiene acceso de solo lectura a la base de datos. Tengo un caché de consultas y un caché de segundo nivel habilitado (modo READ_ONLY) en Hibernate para acelerar el servicio, ya que las tablas a las que se accede cambian raramente.¿La caché de consultas de Hibernate se actualiza automáticamente en una actualización externa?

Mi pregunta es, si alguien va al DB y cambia las tablas manualmente (es decir, fuera de Hibernate), ¿el caché reconoce automáticamente que necesita ser borrado? ¿Hay un límite de tiempo en el caché?

Respuesta

7

No, la memoria caché no escaneará la base de datos para que se actualice mágicamente cuando cambien los datos subyacentes. Los cambios que no provienen de la memoria caché L2 no aparecerán en ella. Cuánto tiempo demora el tiempo de espera depende de su proveedor y de las configuraciones predeterminadas. Parece que ehcache.xml predeterminado es de 2 minutos.

7

Si no va a través de las API de Hibernate para realizar los cambios, la caché de segundo nivel no se notificará y los cambios no serán visibles. La forma habitual de tratar con esta situación es desalojar los objetos correspondientes del caché de segundo nivel programáticamente para forzar una actualización. El SessionFactory proporciona métodos que permiten hacer esto. Desde la sección 19.3. Managing the caches de la documentación:

Para el caché de segundo nivel, hay métodos definidos en SessionFactory para desalojar el estado en caché de una instancia , clase entera, colección instancia o la totalidad papel colección.

sessionFactory.evict(Cat.class, catId); //evict a particular Cat 
sessionFactory.evict(Cat.class); //evict all Cats 
sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular 
                 //collection of kittens 
sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections 
+0

En una aplicación web, en el punto de tiempo/basado en qué condiciones, se llamará este código para el desalojo? ¿Puedes dar un escenario práctico? – user104309

Cuestiones relacionadas