代码之家  ›  专栏  ›  技术社区  ›  BMBM

从nhibernate二级缓存中删除对象

  •  25
  • BMBM  · 技术社区  · 15 年前

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

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

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

    数据变化不太频繁。如果它改变了,用户就不需要在后端中使用一个名为“清除我的缓存”的按钮来删除 这个用户 从缓存中。

    我在网上找到了一个可以删除的解决方案 全部的 从nhibernate二级缓存缓存的对象。但这对我来说有点太残忍了…我不想为几十个用户清除整个缓存,仅仅是因为一个用户试图为自己的数据清除缓存。

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

    这有可能吗?我想这也取决于缓存提供者。如果ASP.NET缓存提供程序不能做到这一点,那么我可以接受其他内置/开放源代码建议。

    1 回复  |  直到 8 年前
        1
  •  43
  •   Frédéric    8 年前

    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