我正在尝试手动清除特定区域的二级缓存。我发现该方法已发布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进行验证。
答案 0 :(得分:0)
好的,所以我想出了我的问题。除了在实体映射中指定缓存区域外,我没有意识到在查询数据时需要指定缓存区域。将.CacheRegion("regionName")
添加到我的查询后,一切正常。通过在查询时不添加区域,它进入查询缓存而没有区域名称。这就是我在没有区域名称参数的情况下调用.EvictQueries()
时有效的原因。
总结一下,有必要在映射实体时添加区域名称(使用Fluent时.Region("regionName")
)和使用.CacheRegion("regionName")
查询isession时。
感谢您的回复。