创建与SQL的新数据库连接需要多长时间

时间:2010-02-02 23:42:11

标签: c# sql

任何人都可以向我提供一个球场时间(以毫秒为单位),表示从C#建立到SQL的新数据库连接需要多长时间。即连接池必须创建新连接时的开销是多少。

3 个答案:

答案 0 :(得分:9)

取决于:

  • 将DNS名称解析为IP
  • 的时间
  • 打开TCP套接字或Net管道(在其他TCP soket之上)的时间:通常是3个IP数据包
  • 如果需要加密,则需要时间来监听SSL / TLS:如果未重复使用SSL / TLS密钥信息,则〜5次往返加上引导主密钥交换的时间(即一次RSA私钥访问,这非常昂贵)
  • 验证SQL身份验证的SQL密码的时间(我相信2次往返)
  • 验证NTLM / Kerberos集成身份验证的时间(1个圆形协议用于协商SPNEGO,如果缺少路缘票,则为5-6次往返,如果票证存在则为1轮次,如果选择NTLM则为4-5次往返)
  • 授权登录的时间(查找metdata,评估登录令牌的权限)
  • 运行任何登录触发器的可能时间
  • 启动连接的时间(与初始SET会话批处理1次往返)

更深奥的时间:

  • 如果在请求中指定,则打开自动关闭数据库的时间(可能包含恢复,通常不会)
  • 如果使用AtachDBFile且数据库尚未附加,则附加数据库的时间
  • 为SQL 2005 RANU启动“用户”实例的时间。那是大约40-60秒。

通常,您每秒可以执行大约10-15个新连接。如果出现问题(例如,DNS查找问题,发出IPsec,SSL问题,Kerberos问题),每个连接可以轻松达到10-15秒。

相比之下,现有的池化连接只需要执行sp_resetconnection(即现有通道上的一次往返),如果需要,甚至可以避免这种情况。

答案 1 :(得分:3)

您总是可以编写一些代码来打开与服务器的连接并为其计时。

类似的东西:

StopWatch timer = new StopWatch();

timer.Start();
for(int i=0;i<100;++i)
{
     using(SqlConnection conn = new SqlConnection("SomeConnectionString;Pooling=False;"))
     {
         test.Open();
     }
}
timer.Stop();
Console.WriteLine(test.Elapsed.Milliseconds/100);

这将获得打开和关闭100个连接的平均时间。注意,我没有运行上面的代码

编辑:根据Richard Szalay的评论禁用连接池。否则,结果将会出现偏差

答案 2 :(得分:1)

这取决于您连接的数据库以及它是本地还是网络,以及网络速度(如果是这样)。如果一切都是本地的,则可能是1或2毫秒(同样取决于DBMS)。如果,更现实地说,它是通过局域网,它仍然可以非常快。这是一个连接到不同子网上的服务器的简单示例(我认为是一跳):

        for ( int i = 0; i < 5; i++ )
           {
           Stopwatch timeit = new Stopwatch();
           timeit.Start();
           AdsConnection conn = new AdsConnection( @"Data Source = \\10.24.36.47:6262\testsys\;" );
           conn.Open();
           timeit.Stop();
           Console.WriteLine( "Milliseconds:  " + timeit.ElapsedMilliseconds.ToString() );
           //conn.Close();
           }

以下是它印刷的时间。第一个是加载程序集和各种DLL的成本。后续的只是新连接初始化的衡量标准:

Milliseconds:  99
Milliseconds:  5
Milliseconds:  4
Milliseconds:  4
Milliseconds:  4