NHibernate如何加载对象

时间:2010-07-30 00:26:27

标签: nhibernate

我对NHibernate有点新意,我对性能有这个问题。 假设我们有两个表AB,分别映射到类AB

class A {
    int IdA;
    //...
}
class B {
    int IdB;
    public A MyA;
    //...
}

首先,我从数据库加载List<A>,然后加载List<B>。加载List<B>时它是否再次查询数据库以获取MyA值,或者NHibernate是否保留了已加载A的引用,以减少重复数据库访问?

提前多多感谢, 阿尼律陀

1 个答案:

答案 0 :(得分:6)

您需要了解缓存如何在NHibernate上运行:

第一级缓存 使用NHibernate时,只要使用标准会话对象,就会自动启用第一级缓存。 [...]当NHibernate通过数据库中的唯一ID加载实体时,它会自动放入所谓的身份映射中。此标识映射表示第一级缓存。第一级缓存的生命周期与当前会话耦合。一旦当前会话关闭,就清除相应的第一级高速缓存的内容。

  • 简而言之,在同一个会话中,NHibernate会自动将结果从缓存中的读取查询中自动保存,并在案例中自动使用它而不是多次调用它。

二级缓存 二级缓存的生命周期与会话工厂相关联,而不是与单个会话相关联。一旦实体由其唯一ID加载并且第二级缓存处于活动状态,该实体可用于(同一会话工厂的)所有其他会话。因此,一旦实体处于二级缓存中,NHibernate将不会从数据库加载实体,直到将其从缓存中移除。

  • 简而言之,无论会话如何,您都可以指定要为进一步操作缓存哪些查询。默认情况下,只要通过NHibernate(而不是外部应用程序)更新缓存的实体,NHibernate就会更新此缓存。

<强> First and second level caching on NHibernate.