我想捕获一些关于使用 SqlConnection 的应用程序的统计数据,特别是它在物理上登录服务器所花费的时间。
简单的方法是这样的:
using (SqlConnection connection = ...)
{
Stopwatch loginTimer = Stopwatch.StartNew();
connection.Open()
loginTimer.Stop();
}
扭曲的是我也在使用连接池并且不想将其关闭。结果,我的指标出现偏差,因为大多数调用.Open()
实际上只是从池中获取现有的、打开的物理连接,所以我会看到:
00:00:01.39
00:00:00.02
00:00:00.02
00:00:00.02
...
该应用程序使用了足够多的连接并以 SqlAzure 为目标,因此我确实希望看到物理登录经常发生。
在尝试之前,我尝试过测试连接:
if (sqlConnection.State != ConnectionState.Open)
{
// Time and call .Open()
}
不幸的是,逻辑 SqlConnection 并不能反映物理连接的状态,所以if
块总是被执行。
我知道可以创建自己的连接池,我可以从中提取和执行,但永远不会关闭,因此我可以通过逻辑连接的状态跟踪物理连接的实际状态,但我会真的不想这样做。