首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nhibernate针对特定区域的清除缓存

Nhibernate针对特定区域的清除缓存
EN

Stack Overflow用户
提问于 2017-11-21 01:16:47
回答 1查看 284关注 0票数 1

我正在尝试手动清除特定区域的二级缓存。我找到了发布在in answer to this question上的方法。虽然这可以清除我的实体,但由于某些原因,querycache没有被清除。这将导致下次从数据库中检索每个实体时对这些实体进行单独的查询。当我在没有任何参数的情况下调用sessionFactory.EvictQueries()时,If确实起作用了。只有当我传入特定的区域名称时,它才不起作用。你知道哪里出了问题吗?

代码来自上面的链接:

代码语言:javascript
复制
private void ClearRegion(string regionName)
    {
        _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);
                }
            }
        }
    }

缓存工作正常,并使用NHProfiler进行了验证。

EN

回答 1

Stack Overflow用户

发布于 2017-11-21 03:56:21

好了,我找到了我的问题所在。我没有意识到在查询数据时,除了在实体映射中指定缓存区域之外,还需要指定一个缓存区域。将.CacheRegion("regionName")添加到我的查询中后,一切正常。通过在查询时不添加区域,它将在没有区域名称的情况下进入查询缓存。这就是为什么当我在不带区域名参数的情况下调用.EvictQueries()时它会起作用。

综上所述,在映射实体(使用Fluent时为.Region("regionName"))以及使用.CacheRegion("regionName")使用isession进行查询时,有必要添加区域名称。

感谢您的回复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47397555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档