我在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;实体数据?
答案 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