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

4

有人可以给我一个大概的时间(以毫秒为单位),来说明在从C#到SQL建立新的数据库连接需要多长时间吗?也就是说,当连接池必须创建一个新的连接时,开销是多少。


http://wiki.answers.com/Q/How_long_is_a_piece_of_string - Ian
感谢您,我意识到我的问题非常开放式,但是这些答案非常出色,详细。谢谢。Ian的答案最有趣! - Pawel
3个回答

12

这要看具体情况:

  • DNS解析成IP的时间
  • 建立TCP套接字或基于其他TCP套接字的Net管道的时间:通常需要3个IP数据包
  • 如果需要加密,则握手SSL/TLS的时间:约为5次往返,并且如果未重用SSL/TLS密钥信息(即一次RSA私钥访问,非常昂贵),则还需时间引导主密钥交换
  • 验证SQL身份验证密码的时间(我认为需要2次往返)
  • 集成身份验证的NTLM / Kerberos身份验证时间(1次往返以协商SPNEGO,如果缺少Kerb票证,则需要5-6次往返,如果票证存在,则需要1次往返,如果选择了NTLM,则需要4-5次往返)
  • 授权登录所需的时间(查找元数据,根据登录令牌评估权限)
  • 可能运行任何登录触发器所需的时间
  • 初始化连接所需的时间(与初始SET会话内容批处理的1次往返)

一些更加偏门的时间:

  • 如果请求中指定了自动关闭的数据库,则打开该数据库所需的时间(可能包括恢复,通常不包括)
  • 如果使用AtachDBFile并且未附加数据库,则附加数据库所需的时间
  • 启动SQL 2005 RANU的“用户”实例需要大约40-60秒钟。

通常情况下,每秒可以进行10-15次新连接。如果出现问题(例如DNS查找问题,IPsec问题,SSL问题,Kerberos问题),连接时间可能会轻松增加到10-15秒。

相比之下,现有的池化连接只需要执行sp_resetconnection(这是在现有通道上的一次往返),即使必要的话也可以避免执行该操作。


顺便说一下,这些时间是针对SQL Server的,我假设OP所指的是“连接到SQL”。 - Remus Rusanu

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的评论禁用了连接池。否则,结果会有所偏差。


3
为了使此测试产生结果,您需要禁用连接池。 - Richard Szalay

1

这要取决于你连接的数据库是本地的还是跨网络的,还有如果是跨网络的话就要考虑网络速度。如果一切都在本地,可能需要 1 或 2 毫秒(具体时间取决于数据库管理系统)。如果更现实一点,连接到局域网上也可以很快。以下是一个简单的例子,连接到不同子网上的服务器(我想应该只需一次跳转):

        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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接