2010-07-30 51 views
2

我对NHibernate有点新,并且我有关于性能的这个问题。 假设我们有两个表,分别为AB,分别映射到ABNHibernate如何加载对象

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

首先我加载从DB一个List<A>,然后加载一个List<B>。当加载List<B>它是否再次查询数据库以获得MyA值,或者NHibernate是否已经保存已加载哪个A的引用,因此它减少了重复的数据库访问?

非常感谢提前, 阿尼律陀

回答

6

您需要了解的缓存是如何工作的NHibernate的:

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

  • 总之,在同一会话中,NHibernate的会自动保存在高速缓存中取出的查询结果,并自动使用它的情况比它被调用一次以上。

二级缓存 二级缓存的续航时间是联系在一起的会话工厂,而不是一个单独的会话。一旦一个实体通过其唯一的ID进行加载并且二级缓存处于活动状态,则该实体可用于(相同会话工厂的)所有其他会话。因此,一旦实体处于二级缓存中,NHibernate将不会从数据库加载该实体,直到将其从缓存中删除。

  • 总之,无论会话,您可以指定哪些查询你想缓存进一步的操作。默认情况下,只要缓存的实体通过NHibernate(而不是外部应用程序)更新,NHibernate将保持此缓存更新。

First and second level caching on NHibernate.

+0

感谢拉斐尔,这给了我一个很好的见识到了什么我真的需要知道:) – Anuruddha 2010-08-01 23:01:18

+0

关于缓存尼斯读:) – 2012-04-05 14:29:11

相关问题