5

より高い負荷(1秒あたり10以上のリクエスト)でmvc + ef + unityアプリケーションでランダムエラー(1日あたり数回)が発生しています:

  • 接続が閉じられていません/接続の現在の状態は接続中です
  • カウントクエリのデッドロック(明示的なトランザクションなし)
  • 同じキーのアイテムはすでに追加されています。DbContextの解決中にSystem.Data.Entity.DbContext.SetTEntityで
  • リモートホストが接続を閉じました。エラーコードは0x80070057です
  • このコマンドに関連付けられている開いているDataReaderがすでにあり、最初に閉じる必要があります。-これを取り除くためにMARSをオンにしました(MARSがなくても正しく機能するはずですが、ネストされたクエリはありません)。これにより、別のランダムエラーが発生する可能性があります。
  • セッションがシングルユーザーモードのときにクライアントドライバーが複数の要求を送信したため、サーバーは接続を切断します。

私はこのPerRequestLifetimeManagerの実装を使用し、Unity.Mvc3も違いなく試しました。

DbContextが正しく破棄されていないというヒントいくつかあります。 リクエストごとが問題の原因であるかどうかはわかりません。これは一般的な方法のようです。

4

1 に答える 1

3

さらに調査した結果、リクエスト処理スレッドが他のスレッドから DbContext を盗むことがあるため、Rashid の PerRequestLifetimeManager の実装はスレッドセーフではない可能性があることがわかりました。もう一度 Unity.Mvc3 に移動したところ、エラーはなくなりました。前回試したときに何らかの間違いを犯したに違いありません。

関係のない唯一のエラーはデッドロックでした。それらはの衝突によって引き起こされました

SELECT ... FROM X JOIN Y ... JOIN Z ...

BEGIN TRAN
UPDATE Z ...
UPDATE Y ...
COMMIT TRAN

SELECT は Y をロックして Z を要求し、TRAN は Z をロックして Y を要求した

于 2013-02-28T14:26:36.897 に答える