猫型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

MySQLの時間のフォーマット

MySQLのdatetime型はそのままSELECTすると、 2013-05-15 13:45:59 のように表示されてしまいます。 yyyy-mm-ddではなく、yyyy/mm/dd がいい場合もあ …

sqlserver

SQLSERVERのトランザクションログの切り捨て・圧縮

トランザクションログはデータの登録・更新記録です。 INDEX1 復旧モデル2 切り捨て3 圧縮 復旧モデル トランザクションログを扱うには、トランザクションログがどのように使用されるかを知る必要があ …

mysql

utilitiesのmysqlrplshowを使いたい

かれこれ3日ほどはまったので恥を忍んでここに記載しておきます :x001: 構成は以下の通りです。 Windows8:192.168.0.99。mysqlrplshowを実行する └centos:19 …

MySQLの実行速度テスト用PHP

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

sqlserver

SQLSERVER サービス起動用ユーザーを作成する

SQLサーバーのサービスを起動しているのは、デフォルトではおそらくAdministratorです。 ここに大きな落とし穴があります。 Administratroのパスワードを変更することはセキュリティ …