c# - 如何在 Fluent NHibernate 上设置 SysCache?

标签 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而且这不是解释性的

最佳答案

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

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

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

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

Cache.ReadWrite( ).IncludeAll( ) ;

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

希望对您有所帮助。

关于c# - 如何在 Fluent NHibernate 上设置 SysCache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3955739/

相关文章:

c# - 如何在 C# 中监控 HTTP 流量并获取 URL 列表?

c# - ProcessStartInfo.UseShellExecute 有什么大不了的?

.net - 在 .NET 中创建电子邮件

c# - ObservableCollection 和 BindingList 的区别

c# - 使用 Windows 身份验证的 NHibernate 模拟

.net - NHibernate 和 Windsor 程序集冲突

c# - 比较 Array[][] 与 SequenceEqual() 和自定义方法的不同结果

C# - 使用谓词选择属性

.net - windows服务-配置文件

nhibernate - 强制休眠保存未更改的对象(将其标记为脏)