2010-02-28 17 views
5

Widzę dziwne zachowanie z pamięci podręcznej nhibernate i nie rozumiem rozumowania. Nie jestem w stanie buforowania zapytań podczas wykonywania operacji wyboru jakProblem pamięci podręcznej nhibernate z zapytaniami linq

query.Select(x=>x).ToList() 

ale może buforować gdy robi:

var query = session.Linq<Promoter>(); 
var p = query.ToList(); 

Zarówno produkować tego samego zapytania SQL i należy doign samo. Poniższy test wyjaśnia problem.

[Test] 
    public void Can_Use_Cache() 
    { 
     ISessionFactory factory = Storage.Application.Get<ISessionFactory>("SessionFactory"); 
     // initial hit on the database and load into cache - all fine 
     using (var session = factory.OpenSession()) 
     { 
      Console.WriteLine(""); 
      Console.WriteLine("First Query"); 
      var query = session.Linq<Promoter>(); 
      query.QueryOptions.SetCachable(true); 
      query.QueryOptions.SetCacheMode(CacheMode.Normal); 
      var p = query.ToList(); 
     } 
     // no hit on the database and retrieved from cache as expected - all fine 
     using (var session = factory.OpenSession()) 
     { 
      Console.WriteLine(""); 
      Console.WriteLine("Second Query"); 
      var query = session.Linq<Promoter>(); 
      query.QueryOptions.SetCachable(true); 
      query.QueryOptions.SetCacheMode(CacheMode.Normal); 
      var p = query.ToList(); 
     } 
     // hits the db - should have come from the cache - not working 
     using (var session = factory.OpenSession()) 
     { 
      Console.WriteLine(""); 
      Console.WriteLine("Third Query"); 
      var query = session.Linq<Promoter>(); 
      query.QueryOptions.SetCachable(true); 
      query.QueryOptions.SetCacheMode(CacheMode.Normal); 
      var p = query.Select(x=>x).ToList(); 
     } 
     // hits the db again - should have come from the cache - again not working 
     using (var session = factory.OpenSession()) 
     { 
      Console.WriteLine(""); 
      Console.WriteLine("Fourth Query"); 
      var query = session.Linq<Promoter>(); 
      query.QueryOptions.SetCachable(true); 
      query.QueryOptions.SetCacheMode(CacheMode.Normal); 
      var p = query.Select(x => x).ToList(); 
     } 
    } 

Moje wyniki testu pokazujące trafienie w db dla drugiego zapytania. zapytania 3 i 4 nie należy uderzenia dB:

2010-02-28 12:05:23,046 INFO Started Logging 

First Query 
2010-02-28 12:05:23,156 DEBUG SELECT this_.Id as Id11_0_, this_.Version as Version11_0_, this_.Name as Name11_0_ FROM Promoters this_ 
NHibernate: SELECT this_.Id as Id11_0_, this_.Version as Version11_0_, this_.Name as Name11_0_ FROM Promoters this_ 

Second Query 

Third Query 
2010-02-28 12:05:23,315 DEBUG SELECT this_.Id as Id11_0_, this_.Version as Version11_0_, this_.Name as Name11_0_ FROM Promoters this_ 
NHibernate: SELECT this_.Id as Id11_0_, this_.Version as Version11_0_, this_.Name as Name11_0_ FROM Promoters this_ 

Fourth Query 
2010-02-28 12:05:23,318 DEBUG SELECT this_.Id as Id11_0_, this_.Version as Version11_0_, this_.Name as Name11_0_ FROM Promoters this_ 
NHibernate: SELECT this_.Id as Id11_0_, this_.Version as Version11_0_, this_.Name as Name11_0_ FROM Promoters this_ 

podręczna jest konfigurowany przy płynnie:

SessionFactory = Fluently.Configure() 
      .Database(MsSqlConfiguration.MsSql2008 
          .ConnectionString(ConfigurationService.SqlConnectionString) 
          .ShowSql() 
         .Cache(c => c 

            .UseQueryCache() 
            .ProviderClass(typeof(NHibernate.Cache.HashtableCacheProvider).AssemblyQualifiedName)) 
         ) 
      .Mappings(m => m.FluentMappings.AddFromAssemblyOf<EventMap>() 
           .Conventions.Setup(MappingConventions.GetConventions())) 
      .ExposeConfiguration(BuildSchema) 
      .BuildSessionFactory(); 

Odpowiedz

2

wydaje się być związany z użyciem .Select) (jak w .Select (X = > x) Z jakiegoś powodu pamięć podręczna jest pomijana przy korzystaniu z select. Wszelkie inne wypowiedzi działać dobrze jak OrderBy(), gdzie() itp

Przykładowy kod poniżej:

using (var session = factory.OpenSession()) 
      { 
       Console.WriteLine(""); 
       var query = session.Linq<Promoter>(); 
       query.QueryOptions.SetCachable(true); 
       query.QueryOptions.SetCacheMode(CacheMode.Normal); 
       var p = query.OrderBy(x => x.Name).ToList();// works fine 
       //var p = query.OrderBy(x => x.Name).Select(x=>x).ToList();// will hit the db 
      } 
Powiązane problemy