如何在Fluent NHibernate上设置SysCache?

时间:2010-10-17 23:13:57

标签: c# .net nhibernate caching fluent-nhibernate

使用这个,我可以告诉Fluent NHibernate使用SysCache作为二级缓存提供者:

MsSqlConfiguration.MsSql2008.ShowSql().ConnectionString(x =>
            {
                x.Server(@"localhost\ANDREPC");
                x.Database("mydb");
                x.TrustedConnection();
            }).Cache(c => c.ProviderClass<SysCacheProvider>().UseQueryCache())

此外,SysCache的配置必须放在Web上.Config:

<configuration>
 <configSections>
  <section name="syscache" type="NHibernate.Caches.SysCache.SysCacheSectionHandler,NHibernate.Caches.SysCache" />
 </configSections>

 <syscache>
  <cache region="foo" expiration="500" priority="4" />
  <cache region="bar" expiration="300" priority="3" />
 </syscache>
</configuration>

现在怎样?这些地区意味着什么?如何将区域与类型相关联?我该如何使它工作?我的jMeter测试认为,在我的应用程序上面的配置比以前慢了7%之后......我需要了解SysCache并学习如何继续配置。

感谢。

PS:官方的SysCache文档是here,它不是解释性的

1 个答案:

答案 0 :(得分:3)

根据您的操作,默认情况下,我认为L2缓存只缓存ID,E.G.调用的项目。 session.Get或session.Load。要使用ICriteria等缓存查询,您需要明确地说要缓存该查询。 E.G。

ICriteria criteria = Session.CreateCriteria( ).SetCacheable( true ).SetCacheRegion( "SomeNameHere" );

这里的一些名称是你的缓存区域。简而言之,这些组合在一起缓存项目,保持这一点真的很简单我通常只是把类/实体的名称,如“人”或“公司”。

设置类映射时,您可能始终希望使用基类中的Cache属性。它的类似

Cache.ReadWrite( ).IncludeAll( ) ;

我个人发现,如果没有这个,当执行查询时,它会缓存结果集中每个项目的ID而不是项目本身,因此这会使得查询速度很快,但是它必须为每个项目执行数据库item,所以如果你有一个非常简单的查询返回100个项目,那么你的数据库可能会被击中100次。我发现将上面的内容添加到我的映射类中解决了这个问题。

希望这有帮助。