8

C#でコード化されたWebサービスがあり、MS SQL Server 2005データベースへの多くの呼び出しを行います。このコードでは、C#の接続プーリングと組み合わせたUsing Usingブロックを使用します。なぜC#接続プーリングでsp_resetconnectionsが非常に多いのですか?

SQLトレース中に、「sp_resetconnection」が多数呼び出されました。これらのほとんどは短い< 0.5秒ですが、時には9秒間続くこともあります。

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

  • オープン接続で状態リセットが必要なのはなぜですか?
  • なぜこれらの呼び出しの多くが!
  • sp_reset接続を呼び出すと、それほど時間がかかりませんでした。

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

+0

sp_reset_connetionに時間がかかることを示すプロファイラトレースがある場合は、呼び出し前にクライアントが行った作業を確認してください。それはあなたがコール中にどの状態が解体されているのかを知ることができます。 – ahains

+0

[sp \ _reset \ _connectionは何をするのですか?](http://stackoverflow.com/questions/596365/what-does-sp-reset-connection-do) –

答えて

12

リセットするだけでリセットされるので、に再接続してをリセットする必要はありません。それは、SETやUSE操作のようなものの接続をきれいに拭き取り、各クエリがクリーンスレートを持つようにします。

接続はまだ再利用されています。ここextensive listです:

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

  • それはそれはすべてのECの(実行コンテキスト)を停止(エラー@@のような)すべてのエラーの状態と数字
  • をリセットします並列クエリを実行する親ECの子スレッドです
  • 未解決の未処理I/O操作を待機します
  • サーバー上の保持されているバッファを解放します。b Y接続
  • は、それはそれはそれは、接続
  • によって作成されたすべての仕事や一時テーブルをクリアする接続
  • が所有して割り当てられたすべてのメモリを解放します
  • 接続で使用されているすべてのバッファリソースのロックを解除しますそれはそれはそれはすべてのシステムTAを閉じます開いているすべてのSQL-XML関連の作業テーブル
  • を削除します
  • 開いているすべてのオープンSQL-XMLハンドルを閉じます接続
  • が所有するすべてのグローバルカーソルを殺す
  • BLES
  • それはそれはそれは
  • 入隊したときに、それはユーザーのための参照カウントをデクリメントします分散トランザクションから欠陥ます開いているトランザクション
  • を中止します
  • すべての一時オブジェクトをドロップしますすべてのユーザー表
  • を閉じます現在のデータベースで。データベースは、それは
  • それがリリースこれは、デフォルト値にすべてのSETオプションをリセットします
  • 取得された可能性のあるハンドルは
  • それは、@@ ROWCOUNT値がリセットされますでしょう取得したロックを解放します
  • をロック共有放出します
  • それが(DBCC TRACEONを使用して、任意のセッション・レベルのトレース・オプションをリセットします@@ identityの値
  • をリセットします)

sp_reset_connectionはリセットされません:正確な接続文字列

  • に基づいて、なぜ接続プーリング試合接続され

    • セキュリティコンテキストを、アプリケーション・ロールが
    • を元に戻すことはできませんので、あなたは、sp_setapproleを使用してアプリケーション・ロールを入力した場合
    • トランザクション分離レベル(!)
  • 1

    ここで言うWhat does sp_reset_connection do?の説明は「一部では、ODBC、OLE-DBなどのデータアクセスAPIの層だと(内部)STを呼び出すのSqlClient接続プールからの接続を再使用する場合のoredプロシージャsp_reset_connection。これは、接続が再利用される前に接続の状態をリセットするためにこれを行います。 "次に、sprocが行うシステムの詳細をいくつか示します。

    1

    sp_resetconnectionは、プールから新しい接続をリクエストするたびに呼び出されます。 これはプールがユーザ(おそらくプログラマおそらく:) を保証しないので、これをしなければなりません。例えばコミットされていないトランザクションとの古い接続を返すことは、おかしいでしょう。

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

    時間がかかっていない電話については、分かりません。その時点で他のものを処理しているサーバーが非常にビジー状態になっている可能性があります。ネットワーク遅延の可能性があります。

    1

    基本的にコールはクリア状態情報です。オープンしているDataReaderがある場合は、発生する時間が長くなります。これは、DataReaderが単一の行を保持しているだけで、さらに多くの行を取得する可能性があるためです。リセットを続行するには、それぞれをクリアする必要があります。したがって、using()ステートメントのすべてを確実にして、ステートメントのいくつかに何かを開いたままにしないでください。

    これが発生したときに実行した接続数はいくつですか?

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

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

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

    関連する問題