生产服务器上的Db连接错误

cod*_*nja 2 .net sql-server

我们在生产服务器上每周至少3次获得followIng异常消息,该网站已经存在2年.虽然数据库服务器很稳定,但永远不会脱机.不知道如何解决这个问题.导致我们的用户丢失他们的会话和任何未保存的工作.

建立与SQL Server的连接时发生与网络相关或特定于实例的错误.服务器未找到或无法访问.验证实例名称是否正确,以及SQL Server是否配置为允许远程连接.(提供者:TCP提供者,错误:0 - 通常只允许使用每个套接字地址(协议/网络地址/端口).

ukh*_*rdy 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";
Run Code Online (Sandbox Code Playgroud)

MSDN博客上阅读Michael的博客.