NHibernate查询缓存每行一个请求来获取实体

时间:2011-04-27 08:23:49

标签: c# .net nhibernate second-level-cache

我在NHibernate中尝试二级缓存。使用此代码:

return session.Query<Payment>()
    .Cacheable()
    .OrderByDescending(payment => payment.Created)
    .Skip((page - 1)*pageSize)
    .Take(pageSize).ToArray();

如果实体不在缓存中,则会导致执行这样的查询:

select ... from Payment where Id = 1
select ... from Payment where Id = 2
select ... from Payment where Id = 3

如果返回100行,则会执行100行。即一个重大的性能问题。如果只执行此查询会更好:

select ... from Payment where Id in (1,2,3)

实体不存在于缓存中可能是因为没有配置实体缓存,缓存的大小有限,或者缓存中的实体已经过期或从缓存中删除。

为了不被迫100%依赖实体缓存,是否有可能改变NHibernate查询的方式&#34;缺少&#34;实体数据?

2 个答案:

答案 0 :(得分:2)

1)是否可以配置NHibernate(我使用FluentNHibernate自动化)来缓存实体?

是的,可以将Nhibernate二级缓存配置为缓存实体。 请参阅Here

2)为了不被迫依赖100%的缓存,是否有可能改变NHibernate查询“缺失”实体数据的方式?

Did you enable "cache.use_query_cache" property in the config file?

答案 1 :(得分:0)

您需要指定相同的缓存区域,以便“激活”与主要实体相同的集合缓存规则。否则它只会缓存主实体,如果主实体是从二级缓存加载的,则再次获取集合。

我不知道FluentNhibernate是否支持此功能,您需要查看文档。

看起来Collections(Bag)支持.Cache(CacheMapping mapping)

http://fluentnhibernate.org/api/FluentNHibernate.MappingModel/CacheMapping.htm