我对NHibernate有点新意,我对性能有这个问题。
假设我们有两个表A
和B
,分别映射到类A
和B
。
class A {
int IdA;
//...
}
class B {
int IdB;
public A MyA;
//...
}
首先,我从数据库加载List<A>
,然后加载List<B>
。加载List<B>
时它是否再次查询数据库以获取MyA
值,或者NHibernate是否保留了已加载A
的引用,以减少重复数据库访问?
提前多多感谢, 阿尼律陀
答案 0 :(得分:6)
您需要了解缓存如何在NHibernate上运行:
第一级缓存 使用NHibernate时,只要使用标准会话对象,就会自动启用第一级缓存。 [...]当NHibernate通过数据库中的唯一ID加载实体时,它会自动放入所谓的身份映射中。此标识映射表示第一级缓存。第一级缓存的生命周期与当前会话耦合。一旦当前会话关闭,就清除相应的第一级高速缓存的内容。
二级缓存 二级缓存的生命周期与会话工厂相关联,而不是与单个会话相关联。一旦实体由其唯一ID加载并且第二级缓存处于活动状态,该实体可用于(同一会话工厂的)所有其他会话。因此,一旦实体处于二级缓存中,NHibernate将不会从数据库加载实体,直到将其从缓存中移除。