4

ときどき、サーバーは次のよく知られた例外をスローします。

タイムアウトになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。

これは、サーバーが大きなリクエストを処理しているときにプレッシャーがかかると発生します。いくつかの調査を行ったところ、接続文字列の接続タイムアウト設定やSqlCommand.Timeoutデータ リーダーのプロパティを変更できることがわかりました。

デフォルトでは、sql コマンドのタイムアウトは30秒に、接続のタイムアウトは15に設定されており、これらをオーバーライドすることはありません。

コンテキストを再現し、失敗したリクエストを管理スタジオで手作業で実行しました。それらの持続時間は約 1秒で、常に30 をはるかに超えています。

しかし奇妙なことに、サーバー ログを見ると、この例外はリクエスト呼び出しの直後にスローされます。つまり、リクエストが実行され、1 ミリ秒後に例外が発生します。すみませんが、この8-oについて私のオタクの見方をさせてください。

完全にするために、SQL インスタンスは同期モードで別のインスタンスとミラーリングされます。テーブル アダプターを介して Ado.Net を使用します。

4

3 に答える 3

4

実際、READ_COMMITED_SNAPSHOTが設定された後でも、これらのランダムなタイムアウトが発生しました。

ミラーを非同期モードに設定しても効果はありませんでした。複数のスレッドで実行されたクエリは、常にビジー状態で、約1ミリ秒後にランダムにタイムアウトしました。一方、タイムアウトをトリガーした特定のクエリ(INSERTステートメント)は、それ自体が非常に高速に実行されました(1ミリ秒未満のCPUと平均で約10回の読み取り)。

コールスタックは次のとおりです。

System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)で

System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)で

System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection externalConnection、DbConnectionFactory connectionFactory)で

System.Data.SqlClient.SqlConnection.Open()で

したがって、タイムアウトはクエリ自体に関連しているようには見えませんでした。

この他の投稿によると:マルチスレッドWindowsサービスでの複数の同時SQL接続タイムアウトおよびADO.NETのバグについて説明しているリンクされたMSDNブログ投稿では、接続文字列で接続タイムアウトを150に設定しようとしました。

このバグが発生したかどうかはわかりませんが、この変更以降、タイムアウトは発生していません。

于 2011-11-24T11:19:22.950 に答える
2

最終的に、何時間にもわたる追跡とプロファイリングの後、問題は次の 2 つの相関関係でした。

  1. コミットされたデフォルトの Sql Server 分離レベルを読み取り、ブロック状態につながる
  2. 非常に不適切に調整されたリクエストと、インデックスのないテーブルが混在するストアド プロシージャ

最初の原因は修正されました

ALTER DATABASE <dbName> SET READ_COMMITTED_SNAPSHOT ON

明快なリクエストの書き換えとテーブルのインデックス作成を伴う2番目。

于 2011-05-06T14:51:15.290 に答える
0

この時点でSQLプロファイラーを実行し、実行されているクエリを確認します。

于 2011-04-21T14:30:11.157 に答える