Nhibernate-lazy-loading
NHibernate-遅延読み込み
この章では、遅延読み込み機能について説明します。 デフォルトではまったく異なる概念であり、NHibernateには遅延読み込みがありません。たとえば、顧客を読み込む場合、すべての注文を読み込むわけではありません。
- 注文コレクションはオンデマンドでロードされます。
- 多対一であってもコレクションであっても、デフォルトで関連付けが遅延ロードされる場合は、 Open ISession が必要です。
- セッションを閉じた場合、またはトランザクションをコミットした場合、これらの追加オブジェクトをプルできない遅延読み込み例外を取得できます。
- 遅延読み込みと実際に必要なデータ量に注意する必要があります。
- アソシエーション全体の遅延読み込みをオフにするか、lazy equals falseを設定するか、フェッチ戦略を指定することもできます。
これが Program.cs ファイルの実装です。
これを理解するために、アプリケーションを実行して、NHibernate Profilerを見てみましょう。
ご覧のように、特定の顧客IDを指定したSelect From Customerがあり、実際にその顧客のコレクションにアクセスするときに別のSelect From Ordersテーブルもあります。
したがって、データベースへの往復は2回あります。 さて、時々、これを最適化したいと思うでしょう。 これを行うには、 customer.hbm.xml ファイルに移動し、フェッチ戦略を追加して、結合フェッチを実行するように依頼します。
アプリケーションのコードを変更していないことがわかるように、 customer.hbm.xml にフェッチ戦略を追加しました。 このアプリケーションを再度実行してみましょう。それでもまったく同じように動作します。 NHibernate Profilerを見てみましょう。
- 以前は、プログラムはデータベースへの2回のラウンドトリップを持っていましたが、現在は1回だけであり、それはここで左外部結合を行っているためです。
- 顧客IDに基づいて、顧客テーブルと注文テーブルの間で左外部結合を行っていることがわかります。したがって、すべての情報を一度に読み込むことができます。
- データベースに1回の往復を保存しました。
- 欠点は、顧客情報が両方の行に複製されることであり、これがSQLの左外部結合が機能する方法です。
- したがって、フェッチ戦略では、もう少しデータを引き戻し、ラウンドトリップを節約しています。
クエリレベルでこれを行うこともできますので、 Program.cs ファイルに移動して、より単純なリロードされた例を見てみましょう。
ここでは、お客様によるロードを行っています。 それをクエリに変更しましょう。次のコードに示すように、リンククエリを使用します。
また、 customer.hbm.xml ファイルからフェッチ戦略を削除しましょう。
このアプリケーションを再度実行すると、次の出力が表示されます。
NHibernate Profilerを見てみましょう。この熱心な結合フェッチが再び発生していることがわかりますが、今回はクエリに基づいています。