NHibernate如何加载对象

Anu*_*dha 2 nhibernate

我对NHibernate有点新意,我对性能有这个问题.假设我们有两个表,A并B映射到类A和B分别.

class A {
    int IdA;
    //...
}
class B {
    int IdB;
    public A MyA;
    //...
}
Run Code Online (Sandbox Code Playgroud)

首先我List<A>从DB 加载一个,然后加载一个List<B>.加载时List<B>它会再次查询数据库以获取MyA值,或者NHibernate A是否已经加载了已经加载了s 的引用,这样可以减少重复的数据库访问?

非常感谢,Anuruddha

reb*_*ard 6

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

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

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

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

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

NHibernate上的第一级和第二级缓存.