8

MS SQL Server 2005 データベースに対して多くの呼び出しを行う C# でコーディングされた Web サービスがあります。コードは、C# の接続プーリングと組み合わせた Using ブロックを使用します。

SQL トレース中に、"sp_resetconnection" への非常に多くの呼び出しが確認されました。これらのほとんどは 0.5 秒未満の短いものですが、場合によっては 9 秒もの通話が続くことがあります。

私が読んだことから、sp_resetconnectionは接続プールに関連しており、基本的に開いている接続の状態をリセットします。私の質問:

  • 開いている接続の状態をリセットする必要があるのはなぜですか?
  • なぜこれほど多くの電話がかかってくるのでしょう!
  • sp_reset 接続の呼び出しに時間がかかる原因は何ですか。

これは私にとってかなりの謎であり、すべての助けに感謝します!

4

4 に答える 4

12

リセットは単にリセットするだけなので、リセットするために再接続する必要はありません。SET 操作や USE 操作などの接続を一掃するため、各クエリは白紙の状態になります。

接続はまだ再利用されています。広範なリストは次のとおりです。

sp_reset_connection は、接続の次の側面をリセットします。

  • すべてのエラー状態と番号をリセットします (@@error など)
  • 並列クエリを実行する親 EC の子スレッドであるすべての EC (実行コンテキスト) を停止します。
  • 未処理の未処理の I/O 操作を待機します。
  • 接続によってサーバー上に保持されているバッファーを解放します
  • 接続で使用されているバッファ リソースのロックを解除します。
  • 接続が所有する割り当てられたすべてのメモリを解放します
  • 接続によって作成された作業テーブルまたは一時テーブルがクリアされます
  • 接続が所有するすべてのグローバルカーソルを強制終了します
  • 開いている SQL-XML ハンドルを閉じます。
  • 開いている SQL-XML 関連の作業テーブルをすべて削除します。
  • すべてのシステムテーブルを閉じます
  • すべてのユーザーテーブルを閉じます
  • すべての一時オブジェクトを削除します
  • 開いているトランザクションを中止します
  • 参加すると分散トランザクションから離脱します
  • 現在のデータベース内のユーザーの参照カウントを減らします。共有データベース ロックを解除する
  • 取得したロックを解放します
  • 取得された可能性のあるハンドルを解放します
  • すべてのSETオプションをデフォルト値にリセットします
  • @@rowcount 値をリセットします
  • @@identity 値をリセットします
  • dbcc traceon() を使用して、セッション レベルのトレース オプションをリセットします。

sp_reset_connection はリセットされません:

  • セキュリティ コンテキスト。これが、接続プーリングが正確な接続文字列に基づいて接続を照合する理由です。
  • アプリケーション ロールは元に戻すことができないため、sp_setapprole を使用してアプリケーション ロールを入力した場合
  • トランザクション分離レベル (!)
于 2009-06-07T17:15:28.553 に答える
1

基本的に、呼び出しはクリアアウト状態情報です。開いている DataReaders がある場合、発生するまでにかなりの時間がかかります。これは、DataReaders が保持している行は 1 つだけですが、さらに多くの行を取得できるためです。リセットを続行する前に、それぞれをクリアする必要があります。そのため、using() ステートメントにすべてが含まれていることを確認し、一部のステートメントで開いたままにしないようにしてください。

これが発生したときに、合計でいくつの接続を実行していますか?

最大で 5 つあり、5 つすべてをヒットした場合、リセットの呼び出しはブロックされ、長い時間がかかるように見えます。実際にはそうではありません。プールされた接続が利用可能になるのを待ってブロックされているだけです。

また、SQL Express で実行している場合は、スレッド要件のために非常に簡単にブロックされる可能性があります (完全な SQL Server でも発生する可能性がありますが、可能性ははるかに低くなります)。

接続プーリングをオフにするとどうなりますか?

于 2009-06-09T21:14:22.827 に答える
1

ここでは、sp_reset_connection の機能について説明します。部分的には、「ODBC、OLE-DB、SqlClient などのデータ アクセス API のレイヤーは、接続プールからの接続を再利用するときに、(内部) ストアド プロシージャ sp_reset_connection を呼び出します。これは、接続が取得される前に接続の状態をリセットするために行われます。再利用します。」次に、そのシステム sproc が行うことの詳細を示します。それは良いことです。

于 2009-06-07T17:24:36.513 に答える
1

sp_resetconnection は、プールから新しい接続を要求するたびに呼び出されます。プールはユーザー (おそらくプログラマー) が適切な状態で接続を終了したことを保証できないため、これを行う必要があります。たとえば、コミットされていないトランザクションで古い接続を返すことは..悪いことです。

呼び出しの数は、新しい接続をフェッチする回数に関連している必要があります。

自明ではない時間がかかる一部の通話については、よくわかりません。その時点でサーバーが他の処理で非常にビジーである可能性があります。ネットワーク遅延の可能性があります。

于 2009-06-07T17:40:02.717 に答える