2009-11-22 16 views
24

Acabo de empezar a pensar en utilizar la memoria caché de segundo nivel de NHibernate en una de mis aplicaciones. Probablemente usaría el NHibernate.Caches.SysCache.SysCacheProvider que se basa en el caché de ASP.net.Eliminando objetos de la memoria caché de segundo nivel NHibernate

Habilitar la caché no fue un problema, pero me pregunto cómo administrar la caché e. gramo. eliminando mediante programación determinadas entidades del caché, etc.

Mi aplicación es algún tipo de base de datos de imágenes. El usuario carga imágenes en un backend y puede verlas en la interfaz accediendo a /ImageDb/Show?userId=someUserId

Los datos no cambian con mucha frecuencia. Y si cambia, los usuarios no importarían un botón llamado "borrar mi caché" en el backend que elimina los objetos en caché para este usuario de la caché.

Encontré una solución en línea que puede eliminar todos los objetos en caché de nhibernates caché de segundo nivel. Pero eso es un poco demasiado brutal para mí ... No quiero borrar todo el caché para docenas de usuarios solo porque un usuario intentó borrar el caché para sus propios datos.

Lo que básicamente quería hacer: eliminar selectivamente los objetos db almacenados en caché de nhibernates caché de segundo nivel en C#.

¿Esto es posible? Supongo que también depende del proveedor de caché. Si esto no es factible con el proveedor de caché de ASP.net, estoy abierto para otras sugerencias de fuente incorporada/abierta.

+0

Sé que probablemente no sea relevante ahora, pero tenga en cuenta que su esquema de URI es incorrecto. Debería ser Users/[Id]/ImageDB/Show –

+0

@the_drow - a menos que la aplicación se llame ImageDb :) Todavía tienes la mayoría de la razón, solo tienes que cambiar ImageDB a/Images o algo –

+0

@LukeSchafer: escribí ImageDb solo porque el OP lo usa. –

Respuesta

40

la sessionFactory proporciona los métodos que desee ... de la 19.3 chapter of the NHibernate reference:

para desalojar por completo todos los objetos de la caché de sesión, llame ISession.Clear() Para el caché de segundo nivel, hay métodos definido en ISessionFactory para desalojar el estado en caché de una instancia , toda la clase, instancia de colección o rol de colección completo.

sessionFactory.Evict(typeof(Cat), catId); //evict a particular Cat 
sessionFactory.Evict(typeof(Cat)); //evict all Cats 
sessionFactory.EvictCollection("Eg.Cat.Kittens", catId); //evict a particular collection of kittens 
sessionFactory.EvictCollection("Eg.Cat.Kittens"); //evict all kitten collections 
+68

Poor gatitos ... –

+6

El nombre del rol aquí en el primer parámetro es el espacio de nombre completo + nombre de clase + nombre de propiedad de lo que necesita desalojar. Puede ver todo en caché llamando a sessionFactory.GetAllCollectionMetaData(). Keys. –

Cuestiones relacionadas