我们在生产服务器上每周至少3次获得followIng异常消息,该网站已经存在2年。虽然数据库服务器很稳定,但永远不会脱机。不知道如何解决这个问题。导致我们的用户丢失他们的会话和任何未保存的工作。
建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:TCP提供者,错误:0 - 通常只允许使用每个套接字地址(协议/网络地址/端口)。
答案 0 :(得分:5)
线索是进一步阅读错误消息并注意以下内容:
(提供者:TCP提供者,错误:0 - 通常只允许使用每个套接字地址(协议/网络地址/端口)。)
最常见的原因是应用程序不使用连接池。 你们都知道汇集是如何工作的,但如果不这样做,那么简短的版本就是开放和关闭连接很昂贵。 因此,当您使用连接池并关闭连接时,它并未真正关闭。 相反,它被放入池中,当打开新连接时,不会创建新连接,而是从池中挑选并“重新激活”。
现在,如果您不使用连接池,则会创建一个新连接,当它关闭时,它将被释放,而不会被放入池中。 为什么这很重要? 好吧,当打开连接时,在客户端上打开一个套接字(或端口),用于与服务器通信。 现在,当连接关闭时,端口没有关闭,而是进入所谓的TIME_WAIT以等待潜在的迟到或错误路由的包等。 端口在TIME_WAIT中的默认值为240秒(4分钟),在此期间,端口不可用。 这意味着在TIME_WAIT状态期间新连接无法使用此端口,并且将打开一个新端口。
如果您在Windows 2003安装上运行应用程序,则可以使用的端口为1024到5000,这意味着大约有4000个端口可用。 更多信息请访问: “TCP TIME-WAIT Delay” http://msdn2.microsoft.com/en-us/library/ms819739.aspx
那么,这是如何结合在一起的呢? 在上面的场景中,假设您有1000名员工或用户,他们都从午餐回来,他们全都坐下来他们使用Web应用程序 为了每个提出4条记录。 每条记录的检索需要1秒钟。现在,如果您使用上述信息并进行数学计算,您将了解1000个用户* 4个连接 在运行Web应用程序的计算机上打开4000个端口,这是限制。现在所有这些端口都将处于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上阅读Michael的博客。