防止 Fluent NHibernate select n+1

2023-11-24

我有一个相当深的对象图(5-6 个节点),当我遍历它的一部分时,NHProf 告诉我我遇到了“选择 N+1”问题(我确实这样做了)。

我知道的两个解决方案是

  1. 渴望负载的孩子
  2. 分解我的对象图(和急切加载)

我真的不想做其中任何一个(尽管我可能会在以后将图表分开,因为我预见它会增长)

目前....

是否可以告诉NHibernate(使用FluentNHibernate),每当我尝试访问子项时,一次性加载它们,而不是在迭代它们时选择-n+1-ing?

我还得到“无界结果集”,这可能是相同的问题(或者更确切地说,如果可能的话,将通过上述解决方案解决)。

每个子集合(整个图表)只会有大约 20 个成员,但 20^5 已经很多了,所以我不想在获取根时急切地加载所有内容,而只是在每次获取子集合时获取所有子集合靠近它。

编辑:事后的想法...如果我想在渲染子项时引入分页怎么办?我是否必须在这里破坏我的对象图,或者我可以采用一些偷偷摸摸的方法来解决所有这些问题吗?


在我看来,您想要采用使用域模型的方法,而不是创建特定的 nhibernate 查询来处理这种情况。鉴于此,我建议您查看可应用于您的集合的批量大小属性。 Fluent NHibernate 流畅接口尚不支持此属性,但作为解决方法,您可以使用:

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20")

鉴于普遍缺乏有关您的确切场景的信息,我无法确定批量大小是否是理想的解决方案,但我当然建议您尝试一下。如果您还没有阅读过,我建议您阅读以下内容:

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

NHibernate 性能文档将解释批量大小的工作原理。

编辑:我不知道有什么方法可以从您的域模型中进行分页。对于需要分页的场景,我建议您编写NH查询。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止 Fluent NHibernate select n+1 的相关文章