从NHibernate二级缓存中删除对象

Max*_*Max 25 nhibernate caching isession second-level-cache

我刚开始考虑在我的一个应用程序中使用NHibernate二级缓存.我可能会使用NHibernate.Caches.SysCache.SysCacheProvider依赖于ASP.net缓存的.

启用缓存不是问题,但我想知道如何管理缓存,例如以编程方式从缓存中删除某些实体等.

我的应用程序是某种图像数据库.用户通过后端上传图像,并可以通过访问在前端查看图像/ImageDb/Show?userId=someUserId

数据不会经常变化.如果它发生变化,用户在后端的名为"清除我的缓存"的按钮无关紧要,该按钮会从缓存中删除此用户的缓存对象.

我在网上找到了一个可以从nhibernates二级缓存中删除所有缓存对象的解决方案.但这对我来说有点太暴力了......我不想为几十个用户清除整个缓存,因为一个用户试图清除缓存中的自己的数据.

所以我基本上想做的是:有选择地从C#中的nhibernates二级缓存中删除缓存的db对象.

这可能吗?我想这也取决于缓存提供商.如果ASP.net缓存提供程序无法做到这一点,我可以使用其他内置/开源建议.

Jag*_*uar 44

sessionFactory提供了你想要的方法......来自NHibernate参考19.3章节:

要从会话高速缓存中完全逐出所有对象,请调用ISession.Clear()对于二级高速缓存,在ISessionFactory上定义了一些方法,用于驱逐实例,整个类,集合实例或整个集合角色的高速缓存状态.

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
Run Code Online (Sandbox Code Playgroud)

  • 第一个参数中的角色名称是您需要逐出的完整Namespace + Classname + Propertyname.您可以通过调用sessionFactory.GetAllCollectionMetaData()来查看缓存中的所有内容. (6认同)