【发布时间】:2014-10-28 05:04:08
【问题描述】:
我正在尝试设置 nhibernate 二级缓存 and i see in this article,,并且我正在尝试了解查询缓存和实体缓存之间的区别。它说你需要添加
Cache.ReadOnly(); or Cache.ReadWrite();
在每一个这样的实体映射上:
public class CountryMap : ClassMap<country>
{
public CountryMap()
{
Table("dropdowns");
Id(x => x.Id, "pkey");
Map(x => x.Name, "ddlong");
Map(x => x.Code, "dddesc");
Where("ddtype = 'COUNTRY'");
//Informing NHibernate that the Country entity itself is cache-able.
Cache.ReadOnly();
}
}
但是当使用 nhibernate profiler 时,我看到了二级缓存,我没有设置这个 Cache.ReadOnly() 值。
真的需要吗?我是否应该为每个实体都这样做(无论该实体多久更改一次?)。
如果答案是肯定的,我应该为所有实体执行此操作,我看到一个页面提到存在使用此行设置实体的风险,因为如果您是,这可能会导致 Select n + 1 查询问题尝试将该实体与查询中的其他实体连接起来。我正在使用 nhibernate 分析器,看起来有些东西正在从下面的代码中访问二级缓存。在我的会话设置中,我有以下代码:
return configuration
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<ApplicationMap>().Conventions.Add(typeof(Conventions)))
.ExposeConfiguration(
c => {
c.SetProperty("cache.provider_class", "NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache");
c.SetProperty("cache.use_second_level_cache", "true");
c.SetProperty("cache.use_query_cache", "true");
c.SetProperty("expiration", "86400");
})
.BuildSessionFactory();
我有一个通用的“查询”方法可以做到这一点:
ICriteria c = Session.CreateCriteria(typeof(T));
c.SetCacheable(true);
return c.Future<T>().AsQueryable();
所以基本上我试图确认我是否正确设置了缓存,因为我在使用 nhibernate 分析器时看到了一些二级缓存命中,但我没有在实体映射代码中设置缓存。我正在尝试确定是否需要做其他事情才能使缓存正常工作(或更好地工作)
当我使用 nhibernate 分析器(没有在实体级别设置 Cache.ReadWrite() )时,它似乎仍然会命中二级缓存。 (见下面的截图)
【问题讨论】:
标签: caching nhibernate fluent-nhibernate