首页 > 数据库 > mysql教程 > 为什么带有 Eager Fetching 的 NHibernate QueryOver 会导致多次数据库查询?

为什么带有 Eager Fetching 的 NHibernate QueryOver 会导致多次数据库查询?

Mary-Kate Olsen
发布: 2025-01-05 02:40:41
原创
319 人浏览过

Why Does NHibernate QueryOver with Eager Fetching Cause Multiple Database Queries?

带有 Fetch 的 NHibernate QueryOver:解释多个 SQL 查询和数据库命中

尝试使用 NHibernate 的 QueryOver 检索实体并获取相关列表时语法上,开发人员可能会遇到大量冗余的 SQL 查询和数据库命中。使用急切获取时会出现此问题。

请考虑以下代码:

Session.QueryOver<UserRole>()
       .Fetch(x => x.UsersInRole).Eager
       .List();
登录后复制

此查询将导致一系列数据库命中,包括:

  • 用于检索 UserRole 实体的初始查询。
  • 多个后续查询以检索每个的 UsersInRole 实体UserRole.

此行为源于 NHibernate 的急切获取策略。启用急切获取后,相关集合将与父实体一起立即加载。但是,每个相关对象可能具有需要检索的不同关联,从而导致额外的查询。

在提供的映射示例中,UserRole 和 UsersInRole 实体具有多对多关系。当急切获取具有此关系的 UserRoles 时,会话将仅包含有关检索到的 UserRole 的信息,而不包含其关联的 UsersInRole 的信息。

为了缓解此问题,应采用批量获取。通过在集合映射上设置 BatchSize 属性,NHibernate 将批量检索相关实体,而不是为每个关联对象执行单独的查询。

解决方案:

HasManyToMany(x => x.UsersInRole)
...
.BatchSize(25)
登录后复制

为两个集合映射(包括类映射)分配批量大小可确保执行多个查询,而不是执行大量冗余查询。确切的查询数量将取决于批量大小和页面大小设置。

以上是为什么带有 Eager Fetching 的 NHibernate QueryOver 会导致多次数据库查询?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板