ホームページ > データベース > mysql チュートリアル > Eager Fetching を使用した NHibernate QueryOver によって複数のデータベース クエリが発生するのはなぜですか?

Eager Fetching を使用した NHibernate QueryOver によって複数のデータベース クエリが発生するのはなぜですか?

Mary-Kate Olsen
リリース: 2025-01-05 02:40:41
オリジナル
323 人が閲覧しました

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

NHibernate QueryOver with Fetch: 複数の SQL クエリとデータベース ヒットの説明

NHibernate の QueryOver を使用してエンティティを取得し、関連リストをフェッチしようとする場合構文を変更すると、開発者は多数の冗長な SQL クエリやデータベース ヒットに遭遇する可能性があります。この問題は、積極的フェッチが使用されている場合に発生します。

次のコードを考えてみましょう:

Session.QueryOver<UserRole>()
       .Fetch(x => x.UsersInRole).Eager
       .List();
ログイン後にコピー

このクエリでは、次のような一連のデータベース ヒットが発生します。

  • UserRole エンティティを取得するための最初のクエリ。
  • それ以降の複数のクエリで、UserRole エンティティを取得します。各 UserRole の UsersInRole エンティティ。

この動作は、NHibernate の熱心なフェッチ戦略に由来します。積極的フェッチが有効な場合、関連するコレクションが親エンティティとともに即座にロードされます。ただし、各関連オブジェクトには、取得する必要がある異なる関連付けがあり、その結果、追加のクエリが発生する可能性があります。

提供されたマッピング例では、UserRole エンティティと UsersInRole エンティティには多対多の関係があります。この関係で UserRoles を積極的にフェッチすると、セッションには、関連付けられた UsersInRole ではなく、取得された UserRole に関する情報のみが含まれます。

この問題を軽減するには、バッチ フェッチを使用する必要があります。コレクション マッピングで BatchSize プロパティを設定すると、NHibernate は、関連付けられたオブジェクトごとに個別のクエリを実行するのではなく、関連するエンティティをバッチで取得します。

解決策:

HasManyToMany(x => x.UsersInRole)
...
.BatchSize(25)
ログイン後にコピー

両方のコレクション マップ (クラス マップを含む) にバッチ サイズを割り当てると、多数の冗長なクエリの代わりに複数のクエリが実行されるようになります。クエリの正確な数は、バッチ サイズとページ サイズの設定によって異なります。

以上がEager Fetching を使用した NHibernate QueryOver によって複数のデータベース クエリが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート