【问题标题】:How to set up SysCache on Fluent NHibernate?如何在 Fluent NHibernate 上设置 SysCache?
【发布时间】:2011-04-26 17:24:37
【问题描述】:

使用这个,我可以告诉 Fluent NHibernate 使用 SysCache 作为 2nd Level Cache Provider:

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,它不是解释性的

【问题讨论】:

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


    【解决方案1】:

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

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

    这里的某个名称是您的缓存区域。简而言之,这会将缓存项组合在一起,保持简洁,我通常只输入类/实体的名称,例如“Person”或“Company”。

    在设置类映射时,您可能总是希望使用基类中的 Cache 属性。它有点像

    Cache.ReadWrite( ).IncludeAll( ) ;
    

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

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多