4

(SMSS のデザイン ツールを使用して) SQL Server データベースのテーブルに単純なスキーマ変更を加えようとしました。変更を保存しようとするたびに、タイムアウトし続けました。これは、テーブルを「ロック」している既存の接続が原因であるかどうか疑問に思いました。

実験として接続を切断することにしました。master..sysprocesses にクエリを実行して、そのデータベースの現在の spid を取得し、スキーマの変更を保存できるようになるまで、それらを 1 つずつ強制終了しました。(あまり科学的ではありませんが、私は SQL Server の専門家ではありません)。案の定、すべての spids (SMSS を使用していたものを除く) を削除すると、スキーマの変更を保存することができました。

ADO.NET SqlConnections と spids の関係についてお聞きしたいと思います。たとえば、クライアント アプリが SqlConnection オブジェクトで Open() を呼び出した場合、master..sysprocesses に別の spid が表示されますか? その SqlConnection で Close() を呼び出すとどうなりますか? スパイは消えるべきですか?

接続プーリングの概念があることを理解しているので、それほど単純ではないと確信していますが、この関係がどのように機能するかについて誰かが光を当てることができますか?

ありがとうございました

デビッド

4

1 に答える 1

4

接続文字列でpooling=falseの場合

SqlConnection.Open()作成およびClose()破棄されるスパイと正確に相関します。これにより、パフォーマンスが非常に遅くなります:)

接続文字列でpooling=trueの場合

呼び出しSqlConnection.Open()は、プールからの既存の物理接続を使用するか、プールで使用可能な接続がない場合は新しい接続を作成します。

新しい物理接続を作成すると、新しいspidが作成され、との新しい行として表示されsys.sysprocessesますsys.dm_exec_connections

既存のプールされた物理接続を再利用すると、既存のspidが再利用されるだけなのでSqlConnection.Open()、サーバー側のこれらのテーブルに目に見える変更を加えることはありません。ただし、SQL ProfilerまたはXEventを使用してsp_reset_connection、を検索することで検出できます。これは、サーバーに接続状態をクリアするように指示するSqlClientによって呼び出されるストアドプロシージャです(たとえば、トランザクションがないことを確認するなど)。

SqlConnection.Close()通常、物理接続をプールに戻すため、サーバーから消えることはありません。kill @spid物理的な接続は、実際には、やなどのサーバーによって強制終了されるなど、内部でさまざまな方法で閉じられますSqlConnection.ClearAllPools()

それが十分な詳細であることを願っていますが、他に知りたいことはありますか?

于 2011-09-16T17:17:16.163 に答える