我尝试了NHibernate中的第二级缓存。有了这个代码: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查询“缺失”实体数据的方式?
1.我设法实体缓存与FNH约定的工作。但是它不会缓存整个实体,即使我使用急切的加载,来自相关表的数据也不会被加入。 – Allrameest 2011-04-27 11:23:26
2.是查询缓存已启用。并且查询被缓存。但查询缓存只包含ids。要获取数据,他们将访问实体缓存或每行执行一个查询以获取数据。 – Allrameest 2011-04-27 11:26:04