2009-07-20 127 views
14

SQL 2000データベースのバックエンドを持つサーバー上で実行されている多数のASP.Net Webサイト(.Net v3.5)があります。数か月の間、私は一見無作為なInvalidOperationExceptionsを "内部接続の致命的なエラー"というメッセージで受け取りました。その間に数日がある場合もあり、1日に複数のエラーがある場合もあります。「内部接続の致命的なエラー」の原因

例外は、特にビジネス・アクセス・アセンブリとデータ・アクセス・アセンブリを共有しますが、1つのサイトに限定されません。エラーは常にSqlClient.TdsParser.Run()からスローされているようです。これは、旧式の直接SqlCommand.Execute()呼び出しからスローされることがありますが、Linq2Sqlコードからスローされることもあります。

私はネットワークの人たちによって、エラーやパケットが最後に失われていないことを保証されています。他の誰かがこれを経験しましたか?それはドライバーの問題だろうか?私たちはまだこの例外の特定のトリガーを特定することができませんでした。

我々は、Windows Server上で2003

答えて

21

この問題を無視して数ヶ月後、トラフィックが徐々に増加するにつれて、それは重要な塊に達し始めました。いくつかのクローラを含む重い荷物の下では、物事は狂ったようになり、これらのエラーは直感的に注ぎ込まれました。

試行錯誤の結果、SqlConnectionが使用直後に閉じられていないSqlCommandまたはLINQクエリがいくつか見つかってしまいました。代わりに、LINQ接続の誤解に由来するいくつかのちょっとしたプログラミングを通して、DataContextオブジェクトは即座にではなく要求の最後にのみ廃棄され(接続が閉じられました)。

これらのメソッドをリファクタリングして、C# "using"ブロック(次のリクエストでそのプールを解放する)ですぐに接続を閉じると、エラーはなくなりました。接続プールが混乱する根本的な理由はまだ分かっていませんが、このタイプのエラーはすべて終了できました。この問題は、私が投稿した別の似たようなエラーで解決されました:Why is my SqlCommand returning a string when it should be an int?

1

をII6を実行しているSqlDumpという名前のファイルには、サーバーのログフォルダ(\プログラムファイル\ Microsoft SQL Serverの\ MSSQL.1 \ MSSQL \ LOGまたは類似)をチェック* .mdmpとSqlDump * .txt。あなたが見つけたら、それを製品サポートに持って行かなければなりません。

1

データベース接続のようなサウンドが低下しているかタイムアウトしています。

私たちは最近、SQL 2000に接続するIIS 5からIIS 6に移行する際に、同様の問題を抱えていました。私たちの問題は、使用可能なエフェメラルポートの数が増えることで解決されました。

IISサーバーによってエフェメラルポートの使用方法を見てください。デフォルトの最大数。使用可能なポートの数は通常4000です。サーバー上のサイトが特にビジー状態の場合や、アプリケーションが大量のデータベース呼び出しを行っている場合は、これを増やすことを検討してください。

これらを最初に監視して、上限を超えていないかどうかを確認できます。

"MaxUserPort"と "TcpTimedWaitDelay"については、マイクロソフトのナレッジベースで検索し、必要なレジストリを変更してください。変更を加える前に、レジストリサーバーまたはスナップショットサーバーを必ずバックアップしてください。変更を有効にするには再起動する必要があります。

データベースとレコードセットの接続が使用後にクローズされていることを再度確認する必要があります。閉じないと、このポート範囲が不必要に使い果たされます。

ストアドプロシージャの効率性は、必要以上に時間がかかる可能性があるため、とにかくチェックしてください。

"4000個のソケットを4分以内ですばやく開いて閉じると、クライアント匿名ポートのデフォルトの最大設定に達し、既存のTIME_WAITソケットがタイムアウトするまで新しいソケット接続の試行が失敗します。 - からhttp://support.microsoft.com/kb/328476

関連する問題