4

我有一个在一个会话中被多次调用的函数。根据我对 NHibernate 一级缓存的理解,无论调用次数如何,同一会话中的精确查询只会执行一次。

但事实并非如此。下面是代码片段,我可以看到在 NHProfiler 中执行的查询与调用该函数的次数一样多。

    public List<CustomerType> GetAllActiveCustomerTypes()
    {
        return _unitOfWork.CurrentSession.QueryOver<CustomerType>().Where(x => x.Active).List();
    }

我在这里理解 NHibernate 是否遗漏了什么?

谢谢

4

1 回答 1

4

你的经验是正确的。会话一级缓存不缓存查询。为了加深理解,请阅读:NHibernate 中的第一级和第二级缓存

一级缓存的摘录:

...第一级缓存也称为身份映射,不仅用于减少到数据库的往返次数以提高应用程序的速度,而且还用于保证不存在对象的两个不同实例拥有相同的ID...

...当使用 NHibernate 时,只要使用标准会话对象,就会自动启用第一级缓存...当 NHibernate 通过其唯一 id 从数据库加载实体时,它会自动放入所谓的身份映射中。 ..

如前所述,它用于entity缓存目的。

二级缓存提取:

  • ...可以在二级缓存中缓存单个实体或整个聚合。
  • ... 还可以在二级缓存中缓存(复杂和/或耗时的)查询。
于 2013-01-12T06:25:32.107 回答