アプリが効果的に機能し、NHibernate が提供する機能 (特にキャッシュと遅延読み込み) を活用できるようにするセッション管理戦略が必要です。
セッションの作成は安価なプロセスであり、事前に RAM や CPU をほとんど必要としないため、セッションの保存や再利用について心配する必要はありません (実際、セッションを再利用すると、厄介で予期しない副作用が発生する可能性があります)。セッション ファクトリはコストがかかるため、アプリの起動時に一度だけビルドする必要があります。
経験則は次のとおりです。セッションの有効期間は、セッションの終了後に永続化されたオブジェクトがスコープ内に留まらないように十分に長くする必要があります。
セッションが終了すると、そのセッションから取得したオブジェクトのすべての変更追跡が停止するため、そのオブジェクトを意図的に新しいセッションに再アタッチしない限り、これらの変更は保存されません。したがって、セッションからフェッチしたオブジェクトが存在する限り、セッションは存在している必要があります。Web アプリでは、これは通常、各要求のセッションを意味します。WinForms では、各フォームのセッション。
あなたの場合、NHibernate の作業を行うサービス (Windows サービスとして実行されていると仮定します) を使用して、消費するデスクトップ アプリからの新しい要求ごとにセッションを作成し、その要求が処理されたときにそれを破棄することを検討することをお勧めします。 . サービスがどのように実行され、デスクトップ アプリがサービスと対話するためにどのようなメカニズムを使用するのか正確にはわかりません (リモーティング? WCF? 従来の SOAP?)。
(この一般的な規則にはいくつかの例外があります。他のコードが参照するが変更されない共有リソースを表す永続化されたオブジェクトのセットがあるとします。これらを app-start で事前にロードし、それ以降は切断したままにしておくことができます。の上。)
このような戦略でパフォーマンスが低下する場合は、データベースとの対話が多すぎて、オブジェクト グラフが複雑になっている可能性があります。この場合、第 2 レベルのキャッシュを見てください。