2013-02-22 17 views
6

C#クライアント、C#WCF Webサービス層、およびSQL Serverデータベースを持つ3層アプリケーションがあります。 Webサービスは、ADO.NETを使用してデータベースに接続します。すべてのC#コードは.NET Framework 2.0を使用しています。ADO.NET接続のオープン時間の監視

最近、顧客がアプリケーションに対してストレステストを実施しました。テスト中、Webサーバーは次のような多くのエラーを生成しました。

接続文字列 '...'のデータベースに接続できませんでした。タイムアウトが切れました。操作が完了する前にタイムアウト時間が経過したか、サーバーが応答していません。

接続プールがいっぱいになったときに接続エラーをキャッチして、接続プール外の接続を取得しようとする方法があります。チューニングが必要なクエリもいくつか見つかりましたが、Webサーバーの接続タイムアウトは説明していません。

私たちは、Webサーバーがデータベースへの接続にタイムアウトした理由を理解しようとしています。 ADO.NET performance countersのすべてを有効にするようにWebサーバーをセットアップしました。しかし、接続に必要な時間や接続タイムアウトなどは何も表示されません。理想的には、他のADO.NETカウンターの隣のperfmonに接続時間をグラフで表示することができます。

接続を取得する際のADO.NETのパフォーマンスを監視する方法はありますか?

私は、接続を開くタイミングを試すことで独自の「平均接続オープンタイム」パフォーマンスカウンタを作成できると思いますが、すでに存在するものを使用したいと思います。

+0

この点についてSQLプロファイラは役に立ちますか? –

+0

@MrMose:プロファイラはいくつかの問題のクエリを見つけるのを助けました。しかし、私は接続時間を監視していつ立ち上がるのか、そしてタイムアウトを開始するのかを確認するための具体的なものが必要です。 –

答えて

2

perfmonを使用してこの情報を入手できます。 User ConnectionsモニターにSQL Server: General Statisticsの下に添付する必要があります。 Here is the blog post私はそれを手に入れました。これにより、接続が開いたままの時点を知ることができます。

これをアプリケーションタスク(つまり、アプリケーションが継続的に登っていくのを見て、アプリケーションで行っていること)と相関させる必要があります。あなたがCloseを発行する必要はありませんこれを行うことにより、

using (SqlConnection cn = new SqlConnection("some connection string")) 
{ 
    cn.Open(); 
    ... 
} 

あなたは、あなたがまだない場合using文の中これらの接続を取得したいとしていることをやったらあなたは彼らが適切に処理されることを心配する必要はありません。

要するに、パフォーマンスカウンタは、問題の原因となっているアプリケーションのコードを追跡するのに役立ちますが、それは行ごとに下がるわけではありません。

+0

ありがとうございますが、私はアプリケーション接続の双眼鏡について心配していません。私はデータオブジェクトが正しくそれをやっていると確信しています。なぜ私はデータベースに接続するのに時間がかかることがあるのだろうと思っています。具体的には、perfmon経由で接続を取得する時間を監視して、接続獲得時のスパイクをI/OやCPUの使用状況などのデータベース番号に一致させることができます。私は自分自身のカウンターを作る以外にこれを行う他の方法は見当たりません。 –

関連する問題