1

我正在尝试 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 查询“丢失”实体数据的方式?

4

2 回答 2

2

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

是的,可以将 Nhibernate 二级缓存配置为缓存实体。参考这里

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

您是否在配置文件中启用了“cache.use_query_cache”属性?

于 2011-04-27T08:41:51.490 回答
0

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

我不知道 FluentNhibernate 是否支持这一点,您需要查看文档。

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

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

于 2011-04-27T13:06:06.233 回答