从NHibernate二级缓存中删除对象

时间:2009-11-22 07:43:23

标签: nhibernate caching second-level-cache isession

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

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

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

在前端查看图像

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

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

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

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

1 个答案:

答案 0 :(得分:44)

sessionFactory提供你想要的方法...... 来自19.3 chapter of the NHibernate reference

要从会话缓存中完全逐出所有对象,请调用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