猫型iPS細胞研究所

Windows、Linux、iOS、DB、Network

DataBase SQLServer

「.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)を確認する方法をご紹介します。

Gooleアドセンス用336

Gooleアドセンス用336

-DataBase, SQLServer
-

執筆者:

関連記事

MySQLの実行速度テスト用PHP

1.testデータベースにtest_tableテーブルを作成。 2.1万件のデータを登録します。 3.1000件のフラグを更新 4.更新したデータを検索する時刻を測定して表示 するサンプルです。 &l …

mysql

MySQLのexists

exists自体はほとんどのSQL自体に実装されていると思われます。 しかし、使用方法を誤るとレスポンスに大きな影響を与えてしまします。 副問合せであるexists内部で、集問い合わせのキー列と結合し …

mysql

MySQLの時間の計算・比較

列同士を比較する datetime型をそのままプラス・マイナスしてはいけません!! 例えば、 mysql> select * from test; +———————+ …

sqlserver

SQL Server 構成マネージャーを起動する

SQL Server 構成マネージャーがない。 何故か、コンピューターの管理の中に入っていた。 また検索窓からは以下のように検索できる。 ・SQL Server 2014 の場合   SQLServe …

mysql

MySQLにファイルからSQLを読み込む

MySQLにファイルからSQLを読み込む方法は 意外と知られていない方法ですのでメモっておきます。 INDEX1 MySQLにログイン中の場合2 スクリプトから実行する場合3 おまけのコマンドで指定す …