2011-03-28 188 views
2

上DB连接错误,我们得到下面的异常信息,每周至少3次,一个asp.net网站,已经住了2年在生产服务器上。虽然数据库服务器是稳定的,永远不会脱机。不知道如何解决这个问题。导致我们的用户失去他们的会话和任何未保存的工作。生产服务器

A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - Only one usage of each socket address (protocol/network address/port) is normally permitted.

回答

4

线索是进一步读入错误消息并发现以下:

(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

+0

较旧的程序员在连接无法打开并重新启用连接时会禁用连接池。不知道为什么。 – 2011-03-28 23:23:18

+0

大开眼界!谢谢 – 2011-03-28 23:25:57

+0

如果未在连接字符串中指定池,则其默认值为true。然后我不应该得到这个错误。但我得到这个错误。另外,在Michael的博客中唯一的评论中,评论者说:“将连接设置为pooling = true后,几乎所有页面的加载时间也大大减少。”我是否需要明确指定pooling = true? – shashi 2011-05-24 09:50:45