2014-04-08 12 views
5

sto cercando di capire come memorizzare nella cache una query uniti utilizzando NHibernate e non sembra come il suo lavoro correttamentePerché in questo esempio non è necessario eseguire il recupero dalla cache?

Ecco il mio codice:

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; 
    } 

corro questo più e più volte e sembra che stia caricando gli oggetti Project dalla cache di secondo livello, ma torna al db per interrogare gli oggetti ProjectApplication che è piuttosto lento

E 'possibile che nhibernate memorizzi nella cache l'intera query in modo che l'intero grafico venga restituito dalla cache?

NOTA: ho la cache delle query acceso, così come tutte le entità stabilite con Cache.ReadWrite()

Qui è la mia configurazione della cache

 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

Puoi mostrare la configurazione della cache? – Najera

+0

@Najera - Ho aggiunto la configurazione della cache – leora

risposta

3

Forse tu sei avere qualche problema con la configurazione del tuo provider di cache. Ive stato in grado di fare vuoi che si desidera utilizzare Couchbase come fornitore di cache di 2 ° livello, come descritto di seguito:

http://blog.couchbase.com/introducing-nhibernate-couchbase-2nd-level-cache-provider

Se il vostro ambiente di distribuzione è su Azure, credo che questo potrebbe essere utile. Si noti che il modulo SysCache non può coesistere con il modulo AzureMemcached.

http://www.webmoco.com/webmoco-development-blog/orchard-cms-second-level-caching