【问题标题】:NHibernate second-level caching - evicting regionsNHibernate 二级缓存 - 驱逐区域
【发布时间】:2012-02-24 15:40:15
【问题描述】:

我们在 nHibernate 实现中设置了许多缓存区域。为了避免负载平衡的 Web 服务器出现问题,我想有效地禁用编辑缓存数据的页面上的缓存。我可以编写一个方法来轻松清除所有查询缓存、类缓存和实体缓存。

但我真正想要的是按区域清除缓存。 sessionFactory.EvictQueries() 将采用区域参数,但 Evict() 和 EvictCollection() 没有。我真的不想在这里丢弃整个缓存,也不想维护某种笨拙的字典,将类型与其缓存区域相关联。 nHibernate 是否有办法询问实体或集合的缓存设置是什么?

谢谢

【问题讨论】:

  • 嘿@Ted,听起来你正在尝试手动做一些你已经可以连接的事情。当对数据存储进行更改时,是否有理由不设置某种缓存依赖项来自动驱逐项目?像 SqlCacheDependency 一样?
  • 或者更好——使用分布式缓存? nHibernate 支持这些
  • 我很想使用分布式缓存,但出于愚蠢的客户原因,客户并不热衷。我现在正在研究 CacheDependency,尽管我们使用的是 Oracle,所以特定的 SQL Server 实现对我来说没有用。看起来 dbCacheDependency 的通用实现是通过轮询工作的,并且依赖于一些 OLEDB 的东西。那是性能吗?它对我的司机选择有影响吗?我正在研究第三方 Oracle 驱动程序,例如 DataDirect 和 Devart 以及 ODP.NET。
  • 所以,dbCacheDependency 对我来说也不是一个选择,因为我们在此时可以进行的数据库更改方面受到相当严格的限制,并且 Oracle 实现依赖于一整套触发器和辅助表来做它的事情。问题是,nHibernate几乎给了我我需要的信息——它很容易为我的实体和集合获取元数据。我只需要访问其中的 标记.....

标签: nhibernate nhibernate-caches


【解决方案1】:

我刚刚做了同样的事情。为了大家的利益,这里是我构造的方法:

public void ClearCache(string regionName)
    {
        // Use your favourite IOC to get to the session factory
        var sessionFactory = ObjectFactory.GetInstance<ISessionFactory>();

        sessionFactory.EvictQueries(regionName);

        foreach (var collectionMetaData in sessionFactory.GetAllCollectionMetadata().Values)
        {
            var collectionPersister = collectionMetaData as NHibernate.Persister.Collection.ICollectionPersister;
            if (collectionPersister != null)
            {
                if ((collectionPersister.Cache != null) && (collectionPersister.Cache.RegionName == regionName))
                {
                    sessionFactory.EvictCollection(collectionPersister.Role);
                }
            }
        }

        foreach (var classMetaData in sessionFactory.GetAllClassMetadata().Values)
        {
            var entityPersister = classMetaData as NHibernate.Persister.Entity.IEntityPersister;
            if (entityPersister != null)
            {
                if ((entityPersister.Cache != null) && (entityPersister.Cache.RegionName == regionName))
                {
                    sessionFactory.EvictEntity(entityPersister.EntityName);
                }
            }
        }
    }

【讨论】:

    【解决方案2】:

    好的,看来我已经回答了我自己的问题。当您拉出 nHibernate 元数据时返回的默认接口不提供有关缓存的信息,但是如果您深入研究它的实现,它会提供。有点笨拙,但确实可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-09
      • 2015-10-23
      • 2011-09-02
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-09-12
      相关资源
      最近更新 更多