1

我使用 Linq 表达式查询我的 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();

据我所知缓存查询发生在二级缓存中,它有一个每个 SessionFactory 范围。另一方面,这意味着为了重新加载我的应用程序数据,我必须重新启动 SessionFactory,我认为这比对会话执行相同操作要昂贵得多。

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

4

1 回答 1

0

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

于 2012-03-30T09:32:19.663 回答