【问题标题】:Removing objects from NHibernate second level cache从 NHibernate 二级缓存中删除对象
【发布时间】:2010-12-19 04:27:25
【问题描述】:

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

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

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

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

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

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

这可能吗?我想这也取决于缓存提供程序。如果这对 ASP.net 缓存提供程序不可行,我愿意接受其他内置/开源建议。

【问题讨论】:

  • 我知道它现在可能不相关,但请注意您的 URI 方案不正确。它应该是 Users/[Id]/ImageDB/Show
  • @the_drow - 除非应用程序被称为 ImageDb :) 你仍然大部分是对的,只需将 ImageDB 更改为 /Images 或其他东西
  • @LukeSchafer:我写 ImageDb 只是因为 OP 使用它。
  • @the_drow - 是的,当然,只是指出它可能是一个虚拟目录而已:)

标签: nhibernate caching second-level-cache isession


【解决方案1】:

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

【讨论】:

  • 这里第一个参数中的角色名是你需要驱逐的完整的Namespace+Classname+Propertyname。您可以通过调用 sessionFactory.GetAllCollectionMetaData().Keys 来查看缓存中的所有内容。
猜你喜欢
  • 1970-01-01
  • 2011-09-02
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2011-02-09
相关资源
最近更新 更多