我试图弄清楚如何使用nhibernate缓存一个连接的查询,它似乎不能正常工作
这是我的代码:
public CacheTestViewModel GetCacheTestViewModel()
{
var vm = new CacheTestViewModel();
var session = Repository.Session;
using (var tx = session.BeginTransaction())
{
vm.Projects = Repository.Session.Query<Project>()
.FetchMany(r=>r.ProjectApplications)
.ThenFetch(r=>r.Application)
.Cacheable().CacheMode(CacheMode.Normal)
.ToList();
tx.Commit();
}
return vm;
}
我一遍又一遍地运行它,它似乎是从二级缓存加载Project对象,但它仍然返回到db来查询ProjectApplication对象,这很慢
nhibernate是否可以缓存整个查询,以便从缓存返回整个图形?
注意:我确实打开了查询缓存以及使用Cache.ReadWrite()设置的所有实体
这是我的缓存配置
return configuration
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<ApplicationMap>().Conventions.Add(typeof(Conventions)))
.ExposeConfiguration(
c => {
// c.SetProperty("proxyfactory.factory_class", proxyFactory);
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();
答案 0 :(得分:3)
也许您在缓存提供程序的配置方面遇到了一些问题。我曾经想要你想要使用Couchbase作为二级缓存提供者,如下所述:
http://blog.couchbase.com/introducing-nhibernate-couchbase-2nd-level-cache-provider
如果您的部署环境位于Azure上,我想这可能很有用。请注意,SysCache模块无法与AzureMemcached模块共存。
http://www.webmoco.com/webmoco-development-blog/orchard-cms-second-level-caching