1

我正在尝试手动清除特定区域的 2 级缓存。我找到了在回答这个问题时发布的方法。虽然这正在清除我的实体,但由于某种原因,查询缓存没有被清除。这会在下次从数据库中检索实体时对每个实体进行单独的查询。当我在没有任何参数的情况下调用 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 进行验证。

4

1 回答 1

0

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

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

谢谢你的回复。

于 2017-11-20T19:56:20.707 回答