NHibernate二级缓存-逐出区域

NHibernate二级缓存-逐出区域,nhibernate,nhibernate-caches,Nhibernate,Nhibernate Caches,我们在nHibernate实现中设置了许多缓存区域。为了避免负载平衡web服务器出现问题,我希望有效地禁用编辑缓存数据的页面上的缓存。我可以编写一个方法,很容易地清除所有查询缓存、类缓存和实体缓存 但我真正想要的是按区域清除缓存。sessionFactory.ReceiveQueries()将接受一个区域参数,但Receive()和ReceiveCollection()不接受。我真的不想在这里扔掉整个缓存,也不想维护某种笨拙的字典,将类型与其缓存区域关联起来。nHibernate是否有办法询问实

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

但我真正想要的是按区域清除缓存。sessionFactory.ReceiveQueries()将接受一个区域参数,但Receive()和ReceiveCollection()不接受。我真的不想在这里扔掉整个缓存,也不想维护某种笨拙的字典,将类型与其缓存区域关联起来。nHibernate是否有办法询问实体或集合其缓存设置是什么


谢谢

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

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

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);
                }
            }
        }
    }
public void ClearCache(字符串regionName)
{
//使用您喜爱的IOC访问会话工厂
var sessionFactory=ObjectFactory.GetInstance();
sessionFactory.ReceiveQueries(regionName);
foreach(sessionFactory.GetAllCollectionMetadata().Values中的var collectionMetaData)
{
var collectionPersister=collectionMetaData作为NHibernate.Persister.Collection.ICollectionPersister;
if(collectionPersister!=null)
{
if((collectionPersister.Cache!=null)&&(collectionPersister.Cache.RegionName==RegionName))
{
sessionFactory.ReceiveCollection(collectionPersister.Role);
}
}
}
foreach(sessionFactory.GetAllClassMetadata().Values中的变量classMetaData)
{
var entityPersister=类元数据为NHibernate.Persister.Entity.IEntityPersister;
if(entityPersister!=null)
{
if((entityPersister.Cache!=null)&&(entityPersister.Cache.RegionName==RegionName))
{
sessionFactory.ReceiveEntity(entityPersister.EntityName);
}
}
}
}

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