我们有一个带有C#客户端,C#WCF Web服务层和SQL Server数据库的3层应用程序。 Web服务使用ADO.NET连接到数据库。我们所有的C#代码都使用.NET Framework 2.0。
最近,客户对我们的应用程序进行了压力测试。在测试期间,Web服务器生成了许多错误,如下所示:
无法连接到数据库以获取连接字符串'...'。超时已过期。操作完成之前经过的超时时间或服务器没有响应。
我知道有些方法可以在连接池已满时捕获连接错误并尝试获取连接池外部的连接。我们还发现了几个需要调整的查询,但它们没有解释Web服务器连接超时。
我们试图弄清楚为什么Web服务器超时连接到数据库。我已设置Web服务器以启用所有ADO.NET performance counters。但是,我没有看到任何与连接或连接超时等所需时间相关的内容。理想情况下,我们可以在其他ADO.NET计数器旁边的perfmon
中绘制连接时间图。
有没有办法在获取连接时监控ADO.NET性能?
我想我们可以通过尝试打开连接来创建我们自己的“平均连接开放时间”性能计数器,但我宁愿使用已经存在的东西。
答案 0 :(得分:2)
您可以使用perfmon
获取此信息。您需要附加到User Connections
下的SQL Server: General Statistics
监视器。 Here is the blog post我抓住了。这将让您知道什么时候连接处于打开状态。
然后,您需要将其与应用程序任务相关联(即,当您看到它们不断攀爬时,您在应用程序中正在执行的操作)。
一旦你完成了这项工作,你就会想要在using
语句中获得这些连接,如果你还没有:
using (SqlConnection cn = new SqlConnection("some connection string"))
{
cn.Open();
...
}
通过这样做,您不需要发出Close
,也不必担心它们会被妥善处理。
简而言之,性能计数器应该可以帮助您跟踪导致问题的应用程序中的代码,但是不会说到这一点,即使从那里开始也需要更多的努力。