問題:
NHibernate の QueryOver 構文を使用してエンティティを取得する関連するコレクションを使用すると、多数のデータベース ヒットが発生します。この動作は、主に多対多のリレーションシップで発生します。
原因:
NHibernate の積極的フェッチ メカニズムは、リレーションの外部キー列で見つかった個別の値ごとに個別のクエリをトリガーします。 。この問題は、コレクションが積極的フェッチ用にマークされているが、ISession に必要なオブジェクトがすべて含まれていない場合に発生します。
マッピング例:
public class UserRoleMap : ClassMap<UserRole> { public UserRoleMap() { Id(x => x.Id); Map(x => x.RoleName); HasManyToMany(x => x.UsersInRole) .Inverse() .LazyLoad() .Table("UsersInRoles"); } }
シナリオ:
次のものがあると仮定します。 data:
Fetch(x => x.UsersInRole) でUserRoleを取得するときは熱心です、最初のクエリはUser1とRole1を取得します。ただし、セッションには、Role1 に関連付けられたすべてのユーザーが含まれていないため、NHibernate は欠落しているユーザーを取得するために複数の追加クエリを実行し、パフォーマンスの低下を引き起こします。
解決策:
推奨される解決策は、バッチ サイズを設定して NHibernate のバッチ フェッチ メカニズムを使用することです。 collection:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
バッチ サイズを 25 以上に設定すると、NHibernate は遅延ロードされたコレクションに対して一度に最大 25 レコードを取得します。この最適化により、最初のクエリ内でのコレクションの取得または最小限の追加クエリが結合され、データベース ヒットが大幅に削減されます。
以上が関連コレクションをフェッチするときに複数のデータベース ヒットを回避するために NHibernate QueryOver を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。