2010-05-07 46 views
1

我使用流畅的nhibernate与asp.net mvc,并且在对数据库进行查询时没有看到任何缓存。我目前没有使用二级缓存实现。流利nhibernate不缓存在asp.net中的查询mvc

我应该看到查询被缓存而没有配置进程外L2缓存吗?

映射是这样的:

Table("ApplicationCategories"); 
Not.LazyLoad(); 
Cache.ReadWrite().IncludeAll(); 
Id(x => x.Id); 
Map(x => x.Name).Not.Nullable(); 
Map(x => x.Description).Nullable(); 

示例标准:

return session 
      .CreateCriteria<ApplicationCategory>() 
      .Add(Restrictions.Eq("Name", _name)) 
      .SetCacheable(true); 

每次我提出一个要求为应用程序cateogry的名字被打的数据库是这一预期的行为吗?

+0

你打开查询缓存吗?如果是,什么是配置? – Paco 2010-05-07 17:23:02

回答

3

一级缓存仅在会话级别,一旦您将缓存与该会话配置在一起。我假设,就像大多数网络应用程序一样,您将按照请求进行会话处理;在这种情况下,每次访问数据库是完全正常的。

当您要在同一会话中执行相同(或类似)查询时,1级缓存最有用,在这种情况下,您只会看到对数据库的一次调用。

+0

DOH! - 是啊,现在完全有道理... – AwkwardCoder 2010-05-07 14:56:20

1

您需要启用二级缓存和查询缓存才能缓存查询。

这有没有*用于“级别1”缓存(会话标识映射)。

如果添加以下属性到你的NHibernate的配置文件:

<property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache</property> 
<property name="cache.use_query_cache">true</property> 

...数据库将不会在随后的电话打。