需要多长时间才能创建到SQL的新数据库连接
这取决于:
- 时间解析DNS名称IP
- 时候打开TCP套接字或网络管(其他TCP SOKET的顶部):一般为3个的IP数据包
- 如果需要加密,则需要使用SSL/TLS进行hanshake:如果SSL/TLS密钥信息未被重用(即,一次RSA私钥访问非常昂贵,则需要5次往返时间加上主密钥交换)
- 时间为SQL身份验证验证SQL密码(我相信2往返)
- 时间验证NTLM/Kerberos进行集成AUTH(1个roundrip协商SPNEGO,5-6往返如果路沿石车票丢失,1个roundtip如果票证是本,如果NTLM选择4-5往返)
- 时间授权登录(查找metdata,评估对登录令牌权限)
- 的时间内运行的任何登录触发器
- 时间启动连接(1个往返与inital SET会话东西批次)
一些更深奥的时代:
- 时间来打开自动关闭数据库如果在请求(可以包括恢复,usualy没有)指定
- 时间附着数据库如果使用AtachDBFile和db尚未连接
- 时间为SQL 2005 RANU启动一个“用户”实例。大约40-60秒。
通常你可以每秒做10-15个新的连接。如果存在问题(例如DNS查找问题,IPsec发布,SSL问题,Kerberos问题),则每个连接可以轻松升级10-15秒。
相比之下,现有的池式连接只需执行sp_resetconnection(即现有通道上的一次往返),甚至可以根据需要避免这种情况。
顺便提一下,SQL Server的时间是特定于SQL Server的,我认为OP的意思是'连接到SQL' – 2010-02-03 00:24:31
感谢您的详细解答 – Pawel 2010-02-04 18:47:46
这取决于您要连接的数据库以及它是本地还是跨网络以及网络速度。如果一切都是本地的,那么可能是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
你总是可以写上去,打开你的服务器和时间,连接一些代码。
喜欢的东西:
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个连接。请注意,我没有运行上面的代码
编辑:根据理查德Szalay的评论禁用连接池。否则,结果将是歪曲
您需要禁用此测试的连接池以产生结果。 – 2010-02-03 15:38:36
http://wiki.answers.com/Q/How_long_is_a_piece_of_string – Ian 2010-02-04 16:33:48
谢谢 - 我意识到我的问题是相当开放式的,但答案是优秀的,详细的。谢谢。伊恩的答案是最有趣的! – Pawel 2010-02-04 18:47:28