2009-06-23 11 views
17

NHibernateでセッション管理の不具合を理解しようとしています。私は多くのトラブルがIoCとAOPの概念の知識不足に起因すると仮定しています。少なくともそれはファビオ・マウロが私の演出を続けているところで私が考えていることです。NHibernateのセッション管理と遅延ロード

とにかく、私の問題は、 "get"呼び出しを行い、結果をグリッドにバインドするwinフォームアプリケーションがあることです。バインド後、ユーザーは、ある種の「書き込み」アクションを実行し、そのセッションの結果は、セッションごとの使用の概念を使用しようとすると、書き込み後に閉じられます。その後、ユーザーはグリッドをスクロールして遅延ロードを開始させ、セッションが終了して例外が発生します。

私の見解をセッションに認識させたくないので、ユーザーがフォームを閉じるときにKillAllSessionsを送信したくありません。さらに、ユーザーはいつでも複数のフォームを開いて、そのメソッドに関連する問題をさらに複雑にすることができます。私は本質的に、これがすべて「舞台裏で」働くことを望んでいます。

これまでのところ、レイジーローディングコールを傍受し、セッションが開いているかどうかを確認し、再オープンしない場合は情報を取得して再閉じてください。しかし、私が知る限りでは、それほど多くはありませんが、これは本質的に遅延ロードがどのように機能するかです。これは、プロキシファクトリ(NHibernate.Bytecode.Castle)によってインターセプトされ、セッションを使用してデータを取得します。だから、私は実際にその呼び出しを傍受し、セッションを再開した後に元の意図した傍受に渡す必要があります。それが私の考えです。

私の質問は本質的にまず第一にこれは正しいことですか?それが二番目の場合、私はどこから始めるべきか分からない。私はメソッド呼び出しを傍受したことは一度もありませんでした。私は理論的には知っていましたが、実際にはそれを知りませんでした。私は、Rhino Commonsのようなものを行うライブラリがあることを知っていますが、私はこの機会を覚えてより良いプログラマになることを願っています。私はAOPとContext Bound Objectsを理解しようとしていますが、現在私はそれをgrokkingしていません。あなたの人の誰かが人を助けてくれますか?

+0

非常に奇妙なことが起こります。セッションは終了後に処分されるべきです。あなたは例を挙げることができますか? – Paco

+0

申し訳ありませんが、どの部分が変わっているようですか?一例として、私はこの問題に直面した一連のイベントをあなたに与える以外に何も知らない: 1.セッションを開く 2. IListの形でデータを取得する 3. ITypedカスタムコレクション 4.データグリッドにバインドします 5.任意の変更が行われます 6.この変更によりセッションが要求されます 7.セッションマネージャはすでに開いているセッションを手にします 8.書き込み機能であるため、完了したらセッションを終了します 9.ユーザーがグリッドをスクロールして遅延読み込みが発生する 10.セッションが開かれていないため例外がスローされる – joshlrogers

+0

スクロール中に遅延読み込みが発生するのはなぜですか? – Paco

答えて

7

私はいくつかのオプションを考えることができます。

オプション1:ユーザーがデータと対話しながら、オープン元ISessionを維持し、ユーザーが実行されたときに一度にすべての変更をコミットします。これは、メモリ内に多数のコミットされていない変更がある可能性があり、他のユーザーには保留中の変更が表示されないことを意味します。

オプション2:操作を2つの作業単位(UOW)に分割します。 UOW1は読み取りのみを行い、リストの作成を担当します。 UOW1に関連付けられたISessionは、ドリルダウンのシナリオなど、遅延ロードを可能にするためにアクティブのままです。 UOW2はユーザーの編集用に作成された新しい短命のISessionです。編集がコミットされると、元のオブジェクトはUOW1から取り除かれ、UOW1はデータベースから新しいコピーをフェッチします。

オプション3:すべての編集がコミットするたびにリストを再作成します。これは最も簡単なソリューションであり、小さなデータセットに適しています。

+0

ジェームス、あなたの応答をありがとう、私は質問があります。オプション1と2を使用すると、ユーザーがアプリケーションまたはフォームを閉じていることを示すセッションマネージャにKillメッセージを送信するビューがなくても、「取得」後にセッションを閉じる方法はありますか? – joshlrogers

+0

あなたのアーキテクチャについてコメントするのに十分なものはありません。しかし、フォームが閉じているときの作業単位の境界のように聞こえます。新しいセッションを作成する以上の責任を持つグローバルセッションマネージャを持つよりも、ローカルでセッションの有効期間を管理するほうがずっと良いと思います。 –

+0

私は、オプション2のバリエーションを使用しました.UOW1セッションを開いたままにしておくと、ユーザーがブラウズするときにグリッドを遅延ロードすることができます。しかし、編集などを行うための個々のセッションの管理は非常に困難でした。データにアクセスするたびに遅延ロードを処理するために、セッションをオンザフライで作成するJoshの考えが本当に好きです。 –

2

私は同様のアプリケーションで作業しています。私は1つのセッションを開いています。

データベースに書き込むたびに、基本セッションを終了しないbegin/commitトランザクションを使用します。データベース接続は、トランザクションの進行中にのみNHibernateによって開かれます。

ユーザーがこのフォームを積極的に使用している間にセッションを閉じる必要がありますか?

セッション、リポジトリパターンなどを管理するために使用しているものについてさらに詳しく説明できますか?

+0

私は私の見解が私のDALまたはその働きを認識するのを妨げようとしているからです。この問題が発生する前に、私のセッションはシングルトンパターンで管理されていました。 – joshlrogers

+0

私は自分のセッション/リポジトリをStructureMapを介して作成し、モデルだけがそれらを使用します。私の見解は永続性を知らない。 – Maggie

+0

アプリケーションの有効期間中、セッションを開いたままにすると危険が生じることに注意してください。 1回のセッションで何百ものエンティティを読み込むと、特に更新でパフォーマンスが悪くなる可能性があります。 –

関連する問題