4

これはかなり一般的な問題のようです。遅延ロードされたコレクションを持つNHibernateオブジェクトをロードします。後で、コレクションにアクセスして何かをします。私はまだnhibernateセッションを開いているので(ビューごとに管理されているなど)、実際には機能しますが、トランザクションは閉じられているため、NHprofでは「暗黙のトランザクションの使用は推奨されていません」。

このメッセージを理解し、作業単位の実装を使用しているので、新しいトランザクションを作成し、その中に遅延ロードされたコレクションへの呼び出しをラップするだけで修正できます。

私の問題は、これが正しく感じられないことです...私はこの素晴らしいNHibernateフレームワークを持っており、遅延読み込みができますが、トランザクション内のすべてのプロパティアクセスをラップせずに使用することはできません。

私はこれをたくさんググって、たくさんのブログ投稿、SOに関する質問などを読みましたが、完全な解決策を見つけることができないようです。

これは私が考えたものです:

  1. 遅延読み込みをオフにします。これはばかげていると思います。スポーツカーでいっぱいになって、エコモードでしか運転しないようなものです。すべてを積極的に読み込むとパフォーマンスが低下します。参照ではなくIDを使用している場合、なぜNhibernateを気にする必要がありますか?
  2. トランザクションをより長く開いたままにします。トランザクションは長続きするべきではなく、ビューが開いている限りトランザクションを開いたままにしておくと、問題が発生するだけです。
  3. トランザクション内のすべての遅延ロードプロパティアクセスをラップします。動作しますが、肥大化してエラーが発生しやすくなります。(つまり、アクセサーをラップするのを忘れた場合でも、正常に機能します。NHProfを使用するだけで問題がわかります)
  4. 最初のオブジェクトをロードするときに、必要になる可能性のあるプロパティのすべてのデータを常にロードします。繰り返しになりますが、これはエラーが発生しやすく、不要なデータをロードする場合(後でアクセスするための呼び出しが削除されたため)、またはデータをロードしない場合の両方で発生します。

それで、より良い方法はありますか?どんな助け/考えもありがたいです。

4

1 に答える 1

0

NHProf でこの警告に最初に遭遇したとき、私は同じ気持ちでした。Web アプリケーションでは、最も一般的な方法は、リクエストの全期間にわたってトランザクション (および作業単位) を開くことだと思います。デスクトップ アプリケーションの場合、トランザクション (およびセッション) を管理するのは面倒な場合があります。自動トランザクション管理フレームワーク (Castle など) を使用して、トランザクション内で実行する属性サービス メソッドを宣言できます。このアプローチを使用すると、要件に応じて、複数の操作を単一のトランザクションにラップできます。また、ビューごとに 1 つのセッションを開き、手動でトランザクションを管理する、ビューごとのセッション アプローチを使用していました (この場合、暗黙的なトランザクションに関するプロファイラーの警告を無視しました)。あなたの考慮事項として:2)と3)は強くお勧めしません。1) と 4) は考慮すべき点です。

于 2012-09-13T12:07:55.110 に答える