2012-11-04 54 views
2

没有得到任何QueryCacheHitCount。的源代码如下所示: NHibernate的3.3.1.4000,FluentnHibernate 1.3.0.733流利的nHibernate - 查询缓存不工作与“session.Query”和Cacheable()

配置:

Factory = Fluently.Configure() 
    .ExposeConfiguration(c => 
     c.SetProperty(NHibernate.Cfg.Environment.GenerateStatistics, "true")) 
    .Database(
    MsSqlConfiguration.MsSql2008.ConnectionString(c => c.Is("DATA SOURCE=localhost;PERSIST SECURITY INFO=True;USER ID=AAA;Password=AAA")) 
      .ShowSql() 
    ) 
    .Mappings(x => x.FluentMappings.AddFromAssemblyOf<Localization.NHibernate.Article>()) 
    .ExposeConfiguration(BuildDatabase) 
    .Cache(
     x => x.UseSecondLevelCache() 
       .UseQueryCache()       
       .ProviderClass<NHibernate.Cache.HashtableCacheProvider>()) 
    .BuildSessionFactory(); 

执行:

using (var tx = session.BeginTransaction()) 
{ 
    Factory.Statistics.Clear(); 

    for (int i = 0; i < 10; i++) 
    { 
     Article s = session.Query<Article>().Cacheable().Where(x => x.Name == "O").SingleOrDefault(); 
    } 

    Console.WriteLine(Factory.Statistics.QueryCacheHitCount); 
    Console.WriteLine(Factory.Statistics.SecondLevelCacheHitCount); 
    Console.WriteLine(Factory.Statistics.QueryExecutionCount); 
} 

只有当我改变缓存的配置,并添加我的私人QueryCacheFactory.QueryCacheFactory<CacheFactory>()比它的作品(但我忽略了IsUpToDate检查)

public class CacheFactory : NHibernate.Cache.IQueryCacheFactory 
{ 
    public NHibernate.Cache.IQueryCache GetQueryCache(string regionName, NHibernate.Cache.UpdateTimestampsCache updateTimestampsCache, Settings settings, IDictionary<string, string> props) 
    { 
     return new MyStandardQueryCache(settings, props, updateTimestampsCache, regionName); 
    } 

    private class MyStandardQueryCache : NHibernate.Cache.StandardQueryCache 
    { 
     public MyStandardQueryCache(Settings settings, IDictionary<string, string> props, NHibernate.Cache.UpdateTimestampsCache updateTimestampsCache, string regionName) 
      : base(settings, props, updateTimestampsCache, regionName) { } 

     protected override bool IsUpToDate(Iesi.Collections.Generic.ISet<string> spaces, long timestamp) 
     { 
      return true; // SET TO TRUE than it's hitting the cache 
     } 
    } 
} 

回答

0

我有一个类似的问题,我记得,查询的结果使用会话或事务的创建时间进行缓存。尝试使用会话进行第一次查询,并针对以下内容使用不同的会话,这样做应该会收到缓存匹配。