C# NHibernate查询缓存每行发出一个请求以获取实体
我正在试用NHibernate的二级缓存。使用此代码:C# NHibernate查询缓存每行发出一个请求以获取实体,c#,.net,nhibernate,second-level-cache,C#,.net,Nhibernate,Second Level Cache,我正在试用NHibernate的二级缓存。使用此代码: return session.Query<Payment>() .Cacheable() .OrderByDescending(payment => payment.Created) .Skip((page - 1)*pageSize) .Take(pageSize).ToArray(); 如果返回100行,将执行其中的100行。也就是说,一个大的性能问题。如果只执行此查询会更好: sel
return session.Query<Payment>()
.Cacheable()
.OrderByDescending(payment => payment.Created)
.Skip((page - 1)*pageSize)
.Take(pageSize).ToArray();
如果返回100行,将执行其中的100行。也就是说,一个大的性能问题。如果只执行此查询会更好:
select ... from Payment where Id in (1,2,3)
缓存中不存在实体可能是因为未配置实体缓存、缓存大小有限或缓存中的实体已过期或已从缓存中删除
为了不被迫100%依赖实体缓存,是否可以更改NHibernate查询“缺失”实体数据的方式?1)是否可以配置NHibernate(我使用FluentNHibernate自动映射)也缓存实体
是,可以将Nhibernate二级缓存配置为缓存实体。
提及
2) 为了不被迫100%依赖缓存,有可能改变NHibernate查询“缺失”实体数据的方式吗
您需要指定相同的缓存区域,以便“激活”与主实体相同的集合缓存规则。否则,它将只缓存主实体,如果主实体是从二级缓存加载的,它将再次获取集合 我不知道FluentNhibernate是否支持这一点,但您需要检查文档 看起来集合(Bag)支持.Cache(CacheMapping)
1。我设法使实体缓存使用FNH约定。但是它不会缓存整个实体,即使我使用了即时加载,相关表中的数据也不会连接。是,已启用查询缓存。并缓存查询。但是查询缓存只包含ID。要获取数据,他们将访问实体缓存或每行执行一次查询以获取数据。我找到了instance.cache.includeal(),但它似乎不起作用…您应该在集合声明中添加缓存。发布你的地图。啊,抱歉,没有看到这不是你正在使用的集合。然后,您应该在entitymapping上声明CacheRegion以进行支付
select ... from Payment where Id in (1,2,3)