从NHibernate二级缓存中移除对象

25

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

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

我的应用程序类似于图像数据库。用户通过后端上传图像,并可以通过访问/ImageDb/Show?userId=someUserId在前端查看它。

数据不经常更改。如果更改,用户不会介意在后端看到一个名为“清除我的缓存”的按钮,该按钮会从缓存中删除此用户的缓存对象。

我在网上找到了一个解决方案,可以删除nhibernate二级缓存中的所有缓存对象。但对于我来说有点太过粗暴了......我不想因为一个用户尝试清除自己数据的缓存而清除数十个用户的整个缓存。

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

这可行吗?我想这也取决于缓存提供程序。如果使用ASP.net缓存提供程序无法完成此操作,我可以考虑其他内置/开源建议。


我知道现在可能不相关,但请注意您的URI方案是不正确的。它应该是Users/[Id]/ImageDB/Show。 - the_drow
@the_drow - 除非应用程序叫做ImageDb :) 你说的大部分还是对的,只需要将ImageDB更改为/Images或其他名称即可。 - Luke Schafer
@LukeSchafer:我只是写了ImageDb,因为OP使用它。 - the_drow
@the_drow - 是的,当然,我只是想指出这可能只是一个虚拟目录 :) - Luke Schafer
1个回答

47

NHibernate参考手册的第19.3章中可以找到sessionFactory提供了您所需的方法:

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

6
第一个参数中的角色名称是需要清除的完整命名空间+类名+属性名。通过调用sessionFactory.GetAllCollectionMetaData().Keys,您可以查看缓存中的所有内容。 - Emil Lerch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接