2

これはよくある質問ですが、これまでに見つかった説明と観察された動作は多少異なります。

MVCWebサイトで次のnHibernate戦略が必要です。

  • リクエストのA SessionScope(変更を追跡するため)
  • インサートのみをラップするActiveRecord.TransactonScope(バッチのロールバック/コミットを有効にするため)
  • トランザクションの外部にあることを選択します(ロックの範囲を減らすため)
  • 挿入の遅延フラッシュ(セッションの終了時に挿入/更新がUoWとして発生するように)

現在、私たちは:

  • SessionScope(FlushAction AutoまたはNeverを使用して)から暗黙のトランザクションを取得しないでください
  • 使用する場合ActiveRecord.TransactionScope、遅延フラッシュはなく、含まれている選択も長時間実行されるトランザクションに追いつきます。

古いバージョンのnHibernate(2.0に非常に近いトランクからのもの)があるためかどうか疑問に思います。

期待されるnHibernateの動作を取得できず、パフォーマンスが低下します(NHProfとSqlProfilerを使用してdbロックを監視します)。

4

1 に答える 1

1

それ以来、私たちが試したことは次のとおりです。

  • 独自の TransactionScope (ITransactionScope から継承) を作成しました。
    • (必要になるまでトランザクションを遅らせる)ではなく、 CommitActiveRecord.TransactionScopeで aを開きます。ctor
    • 何も利用できない場合に「SessionScope」を開きctorます(ガードとして)
  • ID を ID から Guid に変換しました
    • これにより、トランザクションのinsert/外の自動フラッシュが停止しました(!)update

これで、アプリケーションの動作は次のようになります。

  • MVCからのリクエスト
    • SELECTサービスに必要な s が起動され、すべてトランザクションの外部で
    • Repository.Addscope.Commitコントローラーで呼び出されるまで、呼び出しはデータベースにヒットしません
    • すべてINSERTの s / UPDATEs はトランザクション内にアトミック ユニットとしてラップされて発生し、SELECTs は含まれません。

...しかし、何らかの理由で nHProf now != sqlProfiler ( selectnHProf が報告する前に s がデータベースで発生するようです)。

: 怒る前に、ここで問題を認識し、SELECT がトランザクションに含まれていないことを知っています。それがデザインです。TransactionScope一部の操作には、シリアル化されたトランザクションに SELECT (独自の実装がいくつかあります) が含まれます。私たちのコードの大部分は最新のライブ データを必要とせず、個々のオペレーターでワークロードをシリアル化しています。

また、エンティティを手動で更新する必要なく、特に ActiveRecord マークアップを使用して、id列 (非 PK) をポスト更新する方法を誰かが知っている場合(「生成された」属性を使用するnHibernateinsertマッピング ファイルで可能だと思います)。教えてください!!

于 2009-06-27T11:51:07.290 に答える