c# - 监视 ADO.NET 连接打开时间

标签 c# wcf ado.net perfmon connection-timeout

我们有一个 3 层应用程序,其中包含一个 C# 客户端、一个 C# WCF Web 服务层和一个 SQL Server 数据库。 Web 服务使用 ADO.NET 连接到数据库。我们所有的 C# 代码都使用 .NET Framework 2.0。

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

Could not connect to database for connection string '...'. Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.

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

我们正试图找出网络服务器连接数据库超时的原因。我已经设置了 Web 服务器以启用所有 ADO.NET performance counters .但是,我没有看到任何与连接所需时间或连接超时等相关的信息。理想情况下,我们能够在 perfmon 中将连接时间绘制在其他 ADO.NET 计数器旁边。

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

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

最佳答案

您可以使用 perfmon 获取此信息。您需要连接到 SQL Server: General Statistics 下的 User Connections 监视器。 Here is the blog post我从中捕获了那个。这会让您知道连接在什么时间点处于打开状态。

然后您需要将其与应用程序任务相关联(即当您看到应用程序不断攀升时您正在做的事情)。

完成后,您将希望在 using 语句中获取这些连接(如果您还没有的话):

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

通过这样做,您将不需要发出 Close,也不必担心它们会被妥善处理。

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

关于c# - 监视 ADO.NET 连接打开时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15027574/

相关文章:

c# - volatile 与 volatile 读/写?

c# - 运行局域网 WCF 服务

c# - IDataReader 和 "HasColumn",最佳方法?

c# - 在 C# 中将一个 DataView 添加到另一个

entity-framework - 如何使用 Entity Framework 更新对象

c# - Xamarin.Forms:使用 GetMainPage()

来自基类的 C# 泛型方法

c# - 如何使 protobuf-net 在反序列化时不考虑默认数组值

.net - 无法添加对 dll 的引用

c# - 用于扩展方法的 WCF 命名约定