NHibernate Caches:明智的用法,最佳实践?

时间:2012-03-29 12:16:20

标签: c# nhibernate caching query-cache

我使用Linq Expression查询我的NHibernate数据源。 我遇到的问题是表达式中没有两个调用(或评估,对不起的词汇表)在比较中匹配。因此,NHibernate以相同的参数执行相同的SQL。

我通过使用NHibernate缓存解决了这个问题,这样的流程配置如下:

Fluently.Configure().Database(MsSqlConfiguration.MsSql2008
                    .ConnectionString(c => c.Is(cStr))
                    .ShowSql())
                    .Mappings(x => x.FluentMappings.AddFromAssemblyOf<MyClassMap>())
                    .Cache(x=>x.UseQueryCache()
                               .ProviderClass("NHibernate.Cache.HashtableCacheProvider"))

我稍后会照顾服务提供商,这样就不会最终投入生产。 接下来,我的所有查询都被表示为可缓存:

session.Query<MyClass>().Cacheable().Where(filter).ToList();

就我read而言,缓存查询发生在二级缓存中,该缓存具有一个每SessionFactory范围。另一方面,这意味着为了重新加载我的应用程序数据,我将不得不重新使用SessionFactory,我认为这比使用会话做同样的事情要昂贵得多。

使用SessionFactory缓存查询是一种有效的方法,而不会弄乱(不是字面意思,我知道我的意思)吗?

1 个答案:

答案 0 :(得分:0)

你可以清除二级缓存(http://stackoverflow.com/questions/2660714/how-to-clear-the-entire-second-level-cache-in-nhibernate)而无需重新创建SessionFactory但我不是确保提供的代码也清除了缓存的查询。还有一些方法可以用api清除特定的提供者。但据我所知,只有在手动更改db中的数据时才必须手动清除缓存(不是使用NHibernate)。如果您使用NH更改某些内容,它将更新缓存本身。但是,如果您经常更改查询数据,那么缓存将无法帮助您,因为它必须经常更新。