【问题标题】:Nhibernate Clear Cache for a Specific Region特定区域的休眠清除缓存
【发布时间】:2017-11-20 17:16:46
【问题描述】:

我正在尝试手动清除特定区域的 2 级缓存。我找到了in answer to this question 发布的方法。虽然这正在清除我的实体,但由于某种原因,查询缓存没有被清除。这会在下次从数据库中检索实体时对每个实体进行单独的查询。当我在没有任何参数的情况下调用 sessionFactory.EvictQueries() 时,如果确实有效。仅当我传入特定区域名称时它才不起作用。关于出了什么问题的任何想法?

代码来自以上链接:

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 进行缓存和验证。

【问题讨论】:

标签: nhibernate nhibernate-caches


【解决方案1】:

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

综上所述,实体映射时(使用Fluent时为.Region("regionName"))和使用.CacheRegion("regionName")使用isession查询时需要添加区域名称。

感谢您的回复。

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 2017-07-05
    • 1970-01-01
    • 2011-05-25
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2017-05-18
    • 2012-02-05
    相关资源
    最近更新 更多