ジョブを実行することを目的としたWindowsWebサービスのコンテキストでは、Webアプリケーション用に開発したNHibernateDALを再利用しようとします。
セッション管理には2つのオプションがあり、それぞれに長所と短所があります。
ステートフルセッション
- すべてを追跡するため、大幅に成長します(L1 /セッションキャッシュ)
- 注意深く閉じる必要があります。セッションの破棄は、L1キャッシュをクリアするのに十分ではないようです(メモリプロファイラーを使用して気づいたこと)
ステートレスセッション
- 現在、マッピングの再利用に失敗しています。「lazy=true」で宣言されたすべてのバッグは、次の例外で終了します(セッションが閉じられていない場合でも)。
[...]を初期化しても、役割のコレクションを遅延初期化できませんでした:[...]、セッションまたはセッションが閉じられていません
明らかに、マッピング(Webアプリと共有されている)をlazy = "false"で更新することはできません。これは、パフォーマンスにとって大きな欠点になります。
- L2キャッシュと対話できない:共有L2キャッシュがデプロイされると、サービスはL2キャッシュデータを無効にして、Webアプリケーションが最新のデータを取得できるようにすることができなくなります。
NHibernateはこれまで優れていることが証明されており、依存性注入用の構造マップを使用して、ステートフルセッションとNHibernateLINQをWebコンテキストで正常に使用できました。
私の質問は次のとおりです。
- 長時間実行されるスレッドでNHibernateを使用するための良い解決策はありますか?
- ステートフルセッションを使用したいのですが、メモリリークを回避するにはどうすればよいですか?