gpt4 book ai didi

nhibernate - NHibernate 如何加载对象

转载 作者:行者123 更新时间:2023-12-02 08:58:06 24 4
gpt4 key购买 nike

我对 NHibernate 有点陌生,我有一个关于性能的问题。假设我们有两个表,AB ,映射到类 AB分别。

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

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

提前非常感谢,阿耨楼陀

最佳答案

您需要了解缓存在 NHibernate 上的工作原理:

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

  • 简而言之,在同一个 session 中,NHibernate 会自动将获取的查询结果保留在缓存中,并在多次调用的情况下自动使用它。

二级缓存二级缓存的生命周期与 session 工厂相关,而不是与单个 session 相关。一旦实体通过其唯一 ID 加载并且二级缓存处于事件状态,该实体即可用于所有其他 session (同一 session 工厂的)。因此,一旦实体位于二级缓存中,NHibernate 就不会从数据库加载实体,直到将其从缓存中删除为止。

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

<强> First and second level caching on NHibernate.

关于nhibernate - NHibernate 如何加载对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3367945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com