7

C# クライアント、C# WCF Web サービス レイヤー、SQL Server データベースを含む 3 層アプリケーションがあります。Web サービスは、ADO.NET を使用してデータベースに接続します。C# コードはすべて .NET Framework 2.0 を使用しています。

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

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

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

Web サーバーがデータベースへの接続でタイムアウトになった理由を突き止めようとしています。すべてのADO.NET パフォーマンス カウンターを有効にするように Web サーバーをセットアップしました。ただし、接続に必要な時間や接続タイムアウトなどに関連するものは何も表示されません。perfmon理想的には、他の ADO.NET カウンターの横に接続時間をグラフ化できることです。

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

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

4

1 に答える 1

2

を使用perfmonして、この情報を取得できます。User Connectionsの下のモニターに接続する必要がありますSQL Server: General Statistics。これは私がそれをつかんだブログ投稿です。これにより、接続が開いたままになっている時点がわかります。

次に、それをアプリケーションのタスク (つまり、アプリケーションが継続的に上昇しているのを目にするときにアプリケーションで行っていること) と関連付ける必要があります。

usingそれが完了したら、まだ行っていない場合は、ステートメント内でこれらの接続を取得する必要があります。

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

これにより、a を発行する必要がなくなり、Closeそれらが適切に破棄されることを心配する必要がなくなります。

要するに、パフォーマンス カウンターは、問題の原因となっているアプリケーション内のコードを追跡するのに役立ちますが、言うまでもなく、そこからでももう少し手間がかかります。

于 2013-02-25T16:46:23.190 に答える