2013-02-22 75 views
6

我们有一个C#客户端,一个C#WCF Web服务层和一个SQL Server数据库的三层应用程序。 Web服务使用ADO.NET连接到数据库。我们所有的C#代码都使用.NET Framework 2.0。监控ADO.NET连接开放时间

最近,一位客户对我们的应用程序进行了压力测试。在测试过程中,网络服务器产生了很多如下错误:

无法连接到数据库连接字符串'...'。超时过期。操作完成之前超时的时间或服务器没有响应。

我知道有一些方法可以在连接池已满时尝试捕获连接错误,并尝试获取连接池之外的连接。我们还发现了一些需要调整的查询,但它们并没有解释Web服务器连接超时。

我们正试图弄清为什么Web服务器超时连接到数据库。我已经设置了网络服务器来启用所有的ADO.NET performance counters。但是,我没有看到与连接或连接超时等相关的时间相关的任何事情。理想情况下,我们可以在perfmon的其他ADO.NET计数器旁边绘制连接时间图。

有没有办法监控ADO.NET在获取连接时的性能?

我想我们可以通过计时尝试打开连接来创建我们自己的“平均连接开放时间”性能计数器,但我宁愿使用已存在的东西。

+0

SQL Profiler会在这方面提供帮助吗? – 2013-02-22 15:33:06

+0

@MrMoose:分析器在寻找一些问题查询方面帮了很大忙。但是我需要一些特定的东西来监视连接时间,以了解它们何时上升以及何时开始超时。 – 2013-02-22 15:36:09

回答

2

您可以使用perfmon来获取此信息。您需要在SQL Server: General Statistics下附加User Connections监视器。 Here is the blog post我抓住了那个。这会让你知道在什么时候连接处于打开状态。

然后,您需要将其与应用程序任务(即您在应用程序中执行的操作(当您看到它们持续爬升时)进行关联)。

一旦你这样做,你会希望得到一个using语句中的连接,如果您还没有:

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

通过这样做,你就不会需要发出Close你不必担心他们得到妥善处置。

简而言之,性能计数器应该可以帮助您追踪导致问题的应用程序中的代码,但它不会一直说下去,即使从那里开始也需要更多的努力。

+0

谢谢,但我并不担心应用程序连接diposal。我很确定我们的数据对象正确地做到了这一点。我想知道为什么偶尔需要很长时间才能连接到数据库。具体来说,我想监视通过perfmon获取连接的时间,这样我可以将连接获取时间中的尖峰与某些类型的数据库编号(例如未决的I/O或CPU使用率等)相匹配。除了创建我自己的计数器之外,我没有看到任何其他方式来做到这一点。 – 2013-03-04 17:19:43