在这个例子中,为什么不禁止从缓存中检索?

时间:2014-04-08 00:45:11

标签: nhibernate second-level-cache

我试图弄清楚如何使用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();

1 个答案:

答案 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