QA@IT

【C#】Sqlserverの接続プール作成数

6957 PV

Sqlserverの1度に作成する接続プールの数を知りたいです

Sqlserver2014を利用したWebシステムを作成しています。
Sqlserverは接続プールを利用した接続、最小接続「0」、最大接続「100」を設定しています。

この状態でDBを利用した時、接続の度にプールが1つづつ増えていくのでしょうか。
それとも、初めは10個プールが作成されて、10を使い果したらさらに10個追加(合計20)といった感じで増えていくのでしょうか。
その場合、この10個の値も設定可能でしょうか。

駄文ではありますが、回答のご協力お願いします。

  • ご参考に、私の回答で先に紹介したパフォーマンスカウンターの記事のコードの実行結果を回答欄に追記しておきます。 -

回答

ADO.NET + SqlClient を使ってのアプリからの SQL Server へのアクセスの話ですよね。そう理解して・・・

この状態でDBを利用した時、接続の度にプールが1つづつ増えていくのでしょうか。

まず、Connection Pool は接続文字列ごとに作られ、最初はその中の Connection はゼロです。そして、前の接続を Close しないまま次の接続を Open すると一つずつ増えていきます。

Close してから Open すれば Pool の中の Connection が再利用されますので増えることはないです。

そのあたりは以下の記事で最初に出てくる図とその説明 ".Open() メソッドは、コネクションプールからのコネクションの貸し出し処理、.Close() メソッドは、プールへの返却処理になっている。" を見るとよく分かると思います。

.NETの例外処理 Part.2
http://blogs.msdn.com/b/nakama/archive/2009/01/02/net-part-2.aspx

その様子は、以下の記事のコードを NumberOfActiveConnections と NumberOfFreeConnections も有効にして試すと、実際に自分の目で見て確認できると思います。

ADO.NET でのパフォーマンス カウンター
https://msdn.microsoft.com/ja-jp/library/ms254503(v=vs.110).aspx

【2016/2/10 追記】

ご参考に上に紹介したパフォーマンスカウンターの記事のコードの実行結果を書いておきます。記事のコードとは SoftConnectsPerSecond, SoftDisconnectsPerSecond, NumberOfActiveConnections, NumberOfFreeConnections を追加したこと、接続文字列を自分の環境で有効なものに変更したこと以外は同じです。

接続文字列は記事と同様に 3 種類用意して、1st ~ 3rd Connection は別のもの、3rd と 4th Connection は同じものを使っています。

最小接続数、最大接続数はデフォルトで、それぞれ 0, 100 です。

NumberOfActiveConnectionPools, NumberOfActiveConnections, NumberOfFreeConnections の数の変化に着目してください。

それらの数字は最初はゼロで、1st ⇒ 2nd ⇒ 3rd と順に Open していくと NumberOfActiveConnectionPools, NumberOfActiveConnections が一つずつ増えていって、3rd を Open したとき 3 になっています。

4th の接続文字列は 3rd と同じなので、4th を Open すると、NumberOfActiveConnectionPools は 3 のままで、NumberOfActiveConnections は一つ増えて 4 になっています。

1st から 4th を順に Close していくと、NumberOfActiveConnectionPools は 4 から 0 に、NumberOfFreeConnections は 0 から 4 に変化していきます。

CreateConnections メソッドの中を変更すれば上記以外のいろいろなケースを試すことができますので、興味があればやってみてください。

Instance Name: AdoNetPerformanceCounter[8116]
---------------------------
Available Performance Counters:
---------------------------
NumberOfActiveConnectionPools = 0
NumberOfReclaimedConnections = 0
HardConnectsPerSecond = 0
HardDisconnectsPerSecond = 0
NumberOfActiveConnectionPoolGroups = 1
NumberOfInactiveConnectionPoolGroups = 0
NumberOfInactiveConnectionPools = 0
NumberOfNonPooledConnections = 0
NumberOfPooledConnections = 0
NumberOfStasisConnections = 0
SoftConnectsPerSecond = 0
SoftDisconnectsPerSecond = 0
NumberOfActiveConnections = 0
NumberOfFreeConnections = 0
---------------------------
Opened the 1st Connection:
---------------------------
NumberOfActiveConnectionPools = 1
NumberOfReclaimedConnections = 0
HardConnectsPerSecond = 2.869965
HardDisconnectsPerSecond = 0
NumberOfActiveConnectionPoolGroups = 1
NumberOfInactiveConnectionPoolGroups = 0
NumberOfInactiveConnectionPools = 0
NumberOfNonPooledConnections = 0
NumberOfPooledConnections = 1
NumberOfStasisConnections = 0
SoftConnectsPerSecond = 2.849026
SoftDisconnectsPerSecond = 0
NumberOfActiveConnections = 1
NumberOfFreeConnections = 0
---------------------------
Opened the 2nd Connection:
---------------------------
NumberOfActiveConnectionPools = 2
NumberOfReclaimedConnections = 0
HardConnectsPerSecond = 11.31173
HardDisconnectsPerSecond = 0
NumberOfActiveConnectionPoolGroups = 2
NumberOfInactiveConnectionPoolGroups = 0
NumberOfInactiveConnectionPools = 0
NumberOfNonPooledConnections = 0
NumberOfPooledConnections = 2
NumberOfStasisConnections = 0
SoftConnectsPerSecond = 11.2609
SoftDisconnectsPerSecond = 0
NumberOfActiveConnections = 2
NumberOfFreeConnections = 0
---------------------------
Opened the 3rd Connection:
---------------------------
NumberOfActiveConnectionPools = 3
NumberOfReclaimedConnections = 0
HardConnectsPerSecond = 61.84692
HardDisconnectsPerSecond = 0
NumberOfActiveConnectionPoolGroups = 3
NumberOfInactiveConnectionPoolGroups = 0
NumberOfInactiveConnectionPools = 0
NumberOfNonPooledConnections = 0
NumberOfPooledConnections = 3
NumberOfStasisConnections = 0
SoftConnectsPerSecond = 61.21758
SoftDisconnectsPerSecond = 0
NumberOfActiveConnections = 3
NumberOfFreeConnections = 0
---------------------------
Opened the 4th Connection:
---------------------------
NumberOfActiveConnectionPools = 3
NumberOfReclaimedConnections = 0
HardConnectsPerSecond = 72.37984
HardDisconnectsPerSecond = 0
NumberOfActiveConnectionPoolGroups = 3
NumberOfInactiveConnectionPoolGroups = 0
NumberOfInactiveConnectionPools = 0
NumberOfNonPooledConnections = 0
NumberOfPooledConnections = 4
NumberOfStasisConnections = 0
SoftConnectsPerSecond = 70.90068
SoftDisconnectsPerSecond = 0
NumberOfActiveConnections = 4
NumberOfFreeConnections = 0
---------------------------
Closed the 1st Connection:
---------------------------
NumberOfActiveConnectionPools = 3
NumberOfReclaimedConnections = 0
HardConnectsPerSecond = 0
HardDisconnectsPerSecond = 0
NumberOfActiveConnectionPoolGroups = 3
NumberOfInactiveConnectionPoolGroups = 0
NumberOfInactiveConnectionPools = 0
NumberOfNonPooledConnections = 0
NumberOfPooledConnections = 4
NumberOfStasisConnections = 0
SoftConnectsPerSecond = 0
SoftDisconnectsPerSecond = 95.69633
NumberOfActiveConnections = 3
NumberOfFreeConnections = 1
---------------------------
Closed the 2nd Connection:
---------------------------
NumberOfActiveConnectionPools = 3
NumberOfReclaimedConnections = 0
HardConnectsPerSecond = 0
HardDisconnectsPerSecond = 0
NumberOfActiveConnectionPoolGroups = 3
NumberOfInactiveConnectionPoolGroups = 0
NumberOfInactiveConnectionPools = 0
NumberOfNonPooledConnections = 0
NumberOfPooledConnections = 4
NumberOfStasisConnections = 0
SoftConnectsPerSecond = 0
SoftDisconnectsPerSecond = 88.37837
NumberOfActiveConnections = 2
NumberOfFreeConnections = 2
---------------------------
Closed the 3rd Connection:
---------------------------
NumberOfActiveConnectionPools = 3
NumberOfReclaimedConnections = 0
HardConnectsPerSecond = 0
HardDisconnectsPerSecond = 0
NumberOfActiveConnectionPoolGroups = 3
NumberOfInactiveConnectionPoolGroups = 0
NumberOfInactiveConnectionPools = 0
NumberOfNonPooledConnections = 0
NumberOfPooledConnections = 4
NumberOfStasisConnections = 0
SoftConnectsPerSecond = 0
SoftDisconnectsPerSecond = 76.96001
NumberOfActiveConnections = 1
NumberOfFreeConnections = 3
---------------------------
Closed the 4th Connection:
---------------------------
NumberOfActiveConnectionPools = 3
NumberOfReclaimedConnections = 0
HardConnectsPerSecond = 0
HardDisconnectsPerSecond = 0
NumberOfActiveConnectionPoolGroups = 3
NumberOfInactiveConnectionPoolGroups = 0
NumberOfInactiveConnectionPools = 0
NumberOfNonPooledConnections = 0
NumberOfPooledConnections = 4
NumberOfStasisConnections = 0
SoftConnectsPerSecond = 0
SoftDisconnectsPerSecond = 91.78379
NumberOfActiveConnections = 0
NumberOfFreeConnections = 4
---------------------------
Press Enter to finish.
編集 履歴 (1)
  • SurferOnWwwさん

    細かい回答、追記までして頂き、ありがとうございます。
    教えて頂いたリンクの通り、サーバのパフォーマンスカウンタにODBCを追加することでプールの細かい状況が知ることができました。
    接続ごとに1つづつプールが作成されていくこともわかり、大変参考になりました。

    ありがとうございました。
    -
  • サーバのパフォーマンスカウンタからではなかったです。
    失礼しました。
    -

デフォルトでは最小プール数はゼロですので、使った分しか確保されませんが、例えば接続文字列でMin Pool Sizeとかを設定すると、最小プールサイズを変えることができます。

接続確保の動作が細かく見てどうだったかはちょっと覚えてません。
※例えば一定時間おきに接続が増やされるとか、一気に最小プール数まで増やされるとか

編集 履歴 (0)
  • あとはライフタイムが過ぎたら接続は自動解放されたと思いますが、そのときに自動で最小プール数までは増やすのだったか、その辺もちょっと覚えてません。 -
  • あ、ちょっと質問読み違えてました。最小プール数がゼロ前提での話ですね、失礼。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。