线索是进一步读入错误消息并发现以下:
(provider:TCP提供,错误:0 - 每个套接字地址中的一个使用量(协议/网络地址/端口)通常是允许的。)
最常见的原因是应用程序未使用连接池。 你们都知道如何合并工作,但如果你不这样做,简短的版本是开放和关闭连接是昂贵的。 因此,当您使用连接池并关闭连接时,它并未真正关闭。 相反,它被放入一个游泳池和一个新的连接打开时,则不会创建一个新的连接,而是从池中挑选和“激活”。
现在,如果您不使用连接池,则会创建一个新的连接,并在关闭时将其处置并放入池中。 为什么这很重要? 那么,打开连接时,客户端将打开一个套接字(或端口),以便与服务器进行通信。 现在,当连接关闭时,端口未关闭,而是进入所谓的TIME_WAIT以等待可能延迟或错误路由的包等。 端口在TIME_WAIT中的默认值为240秒(4分钟),在此期间,该端口不可用。 这意味着,TIME_WAIT状态中一个新的连接不能使用此端口,以及一个新的将被打开。
如果您在Windows 2003安装上运行应用程序,则可以使用的端口数为1024到5000,这意味着大约有4000个端口可用。 多见于: “TCP TIME-WAIT延迟” http://msdn2.microsoft.com/en-us/library/ms819739.aspx
那么,请问这是怎么结合在一起? 在上述情况下,假设你有1000名员工或用户,他们都来自午餐回来,他们坐了下来,他们所使用的Web应用程序 为用户带来了4条记录每个。 每个记录的检索需要1秒。现在,如果您使用上述信息,并做数学题你就会明白,1000个用户* 4米的连接将 打开4000个端口运行的Web应用程序,这是限制在机器上。现在,所有这些端口将处于TIME_WAIT状态4分钟 ,在此期间,任何新的连接不能打开,你会得到上述错误。 4分钟后,端口释放,用户可以再次连接。
但是,如果使用连接池,这不会发生,因为连接未关闭,因此它不会将端口置于TIME_WAIT。
在.Net应用程序中,默认情况下,池应该处于ON状态,但它可能已在连接字符串中被禁用(或设置为false)。 所以,简单地看看连接字符串,并相应地改变它:
// Pooling false = fails
string cs = @"Data Source=tcp:<your server>;Integrated Security=True;Pooling=false";
// Pooling true = works, this is the default but included here for clarity
string cs = @"Data Source=tcp:<your server>;Integrated Security=True;Pooling=true";
阅读迈克尔的博客上MSDN Blogs。
较旧的程序员在连接无法打开并重新启用连接时会禁用连接池。不知道为什么。 – 2011-03-28 23:23:18
大开眼界!谢谢 – 2011-03-28 23:25:57
如果未在连接字符串中指定池,则其默认值为true。然后我不应该得到这个错误。但我得到这个错误。另外,在Michael的博客中唯一的评论中,评论者说:“将连接设置为pooling = true后,几乎所有页面的加载时间也大大减少。”我是否需要明确指定pooling = true? – shashi 2011-05-24 09:50:45