3

NHibernateセッションをASP.NETセッションにキャッシュしています。

ユーザーがオブジェクトを編集して、ISessionの最初のレベルのキャッシュに入れるという状況に遭遇しました。次に、別のユーザーが同じオブジェクトを編集しました。

この時点で、User1は編集の元のバージョンを引き続き表示しますが、User2はオブジェクトの正しい状態を表示しますか?

常にすべてのオブジェクトに対して明示的にsession.Refresh(myObj)を呼び出さずに、これを処理する正しい方法は何ですか?

また、第2レベルのキャッシュを有効にしています。NHibernate Long Sessionの場合、第1レベルのキャッシュを完全に無効にする必要がありますか?

編集:10.4.1から達成しようとしていることにいくつかの用語を追加します。自動バージョン管理を伴う長いセッションこのセクションの終わりは、

ISessionは(必須の)第1レベルのキャッシュでもあり、ロードされたすべてのオブジェクトが含まれているため、この戦略は、数回の要求/応答サイクルでのみ適切に使用できます。ISessionにもまもなく古いデータが含まれるため、これは確かに推奨されます。

おそらく両方を含めるためにこれがどのような種類のドキュメントであるかはわかりませんが、すぐにセッションに古いデータが含まれると言います(これは私が見ているものです)。これに対する解決策はここにありますか、それともありませんか?

4

3 に答える 3

3
  • 第1レベルのキャッシュを無効にすることはできません。
  • NHibernateドキュメントの「楽観的同時実行制御」を確認してください。
  • NHibernate.Burrowも見てください。長い会話をお楽しみください。
于 2010-09-20T19:18:40.913 に答える
3

ISessionの代わりにIStatelessSessionを使用してください。

また、NHは、(他の人がすでに述べたように)長寿命のISessionで使用するように設計されていないことにも注意してください。1つの問題はあなたがすでに述べたことです。もう1つは、NHによって追跡される大きなオブジェクトのグラフがある場合、パフォーマンスが大幅に低下することです。IStatelesSessionを使用することで、両方の問題を回避できます。NHによって追跡されていない分離オブジェクトを提供します。

ASP.NETセッションでセッションを維持する理由がわからない。たぶんあなたはいくつかの詳細を提供できますか?

また、セッションはIDbConnectionのラッパーであることを忘れないでください。開いたままにしておくと、接続プールが不足する可能性があります。

于 2010-09-20T19:23:34.820 に答える
0

Apparently this is a known shortcoming of NHibernate as detailed by documentation cited in my question.

于 2011-03-28T14:39:25.390 に答える