「.NET」と「ASP.NET」からのSQL Serverへのコネクションを確認する(1)

コネクション数と状態を確認する

SQLSERVERのコネクション数を確認するには下記のSQLを実行します。
接続元ホスト毎のコネクション数を確認することができます。
少し編集すれば、接続ユーザー毎やステータス毎の集計も簡単に出力できます。

select hostname,count(*) from master..sysprocesses where hostname!='' group by hostname

もしここで以上にコネクション数が増加していれば、Close(もしくはDispose)を忘れていることが考えられます。
下記SQLを実行してて、statusとcmdの列に注目して下さい。

select * from master..sysprocesses where hostname!='';

statusがsleeping、cmdがAWAITING COMMAND(=コマンド待ち)の行が大量にありませんか?
もしそうなら、コネクションやDataReaderなどのClose処理を忘れていることになります。
コネクション数は有限です。閉じ忘れのコネクションがあれば、大規模なシステムでは致命傷となります。
MAXコネクション数の確認をするには下記のSQLを実行します。
デフォルトでは32767のようです。小規模なシステムや、アクセスの限られる環境では問題にならないかもしれませんが・・・。

SELECT @@MAX_CONNECTIONS

コネクションプールとは

SQLSERVERを利用する多くの方は、恐らくコネクションプールという機能を利用しています。
コネクションの生成には大きいなオーバーヘッドが発生します。
そのため使用したコネクションを閉じると、一度コネクションプールという場所に移動し、再度コネクションが必要となった場合にはそのコネクションプールにたまったコネクションから使用するのです。

しかし、接続の閉じ忘れがあると、コネクションを使用し終わったにもかかわらず再利用できず、新しい接続要求があれば、別途新しいコネクションを生成することになるのです。
もちろんオーバーヘッドも発生しますし、コネクション自体リソースを消費するものですので上限があり、デフォルト値では32767です。

仮に1アクセスで5コネクション使用するシステムの場合、全くコネクションを閉じなければ約6、500アクセスでリソースが尽きることになります。
(実際にはガベージコレクションが働きもう少し利用できることでしょう。)

そのため大規模システムではコネクションの管理は必須です。

コネクションを制御する設定

コネクションは接続文字列(ConnectionString)により接続時、接続毎に設定をします。
例えば下記のように設定します。

con.ConnectionString = "Data Source=localhost;User Id=user;Password=pass;Initial Catalog=TestDB;Pooling=true;Min Pool Size=0;Max Pool Size=10;Connection Lifetime=1"

Pooling:デフォルト値はtrueです。falseにするとプールせずにすぐ破棄します。trueがよいでしょう。

Min Pool Size:デフォルト値は0です。最低限プールにためておくコネクション数です。例えばもし常時5コネクションは必要なシステムの場合は、7あたりを設定しておけば、コネクション生成によるオーバーヘッドを回避できます。

Max Pool Size:デフォルト値は100です。プールできる最大数です。これ以上の接続をしようとするとエラーになります。無駄におおきくするとリソースを消費するので適切な値を設定しましょう。

Connection Lifetime:コネクションがプールに入った時に、生成されてからの時間を比較して、指定した秒数以上経過していればコネクションを破棄します。プールに入るタイミングで判定するため、10を設定したからといって10秒で破棄されるわけではありません。.NETのシステムではアプリが終了すれば全てのコネクションは破棄されます。一方、ASP(WEB)システムの場合はCLOSEし、そのページの処理が終わったからといっても明示的に破棄といった信号はありません。
正しくCLOSE処理をしていればプールにたまるだけです。不必要なコネクションがたまるようなら適切なライフタイムを設定し、コネクションがたまりすぎないようにします。

今回はコネクション数の確認方法や、設定方法を紹介しました。
次回はコネクションの状態(Free/Active)を確認する方法をご紹介します。

タイトルとURLをコピーしました