NHibernate二级缓存 - 驱逐区域

时间:2012-02-24 15:40:16

标签: nhibernate nhibernate-caches

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

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

感谢

2 个答案:

答案 0 :(得分:5)

我刚刚做了同样的事情。为了每个人的利益,这是我构建的方法:

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);
                }
            }
        }
    }

答案 1 :(得分:0)

好的,看起来我已经回答了我自己的问题。在提取nHibernate元数据时返回的默认界面并没有提供有关缓存的信息,但是如果你深入研究它的实现,它确实如此。有点笨拙,但它确实有效。