连接池未满,但在获取连接之前超时了

11

我甚至不想提起这个问题,因为已经有数百页关于这个错误的讨论,追溯到7-8年前... 然而,我还是无法完全弄清楚。

我在A服务器上运行一个报告服务,它连接到B服务器上的SQL Server 2008 R2。两台服务器都在运行Windows Server 2008。报告服务是多线程的,每次可以同时运行最多10个报告,每个报告都在自己的线程上运行。
我的连接字符串如下:

Data Source=ServerB;Initial Catalog=DBName;trusted_connection=YES;Connection Timeout=0;Max Pool Size=500;

我将连接超时设置为0以等待连接直到它可用,并将最大池大小设置为500,因为我想确保池对于我的多线程服务来说不太小。当服务启动并有报告队列等待处理时,该错误通常只会出现。

所以显然,要做的第一件事就是查找泄漏的连接...必须存在未关闭的连接导致池填满,对吗?不是这样的——看起来池从未填满。

我已经花费了几个小时在服务器上运行性能监视器,观察“.NET Data Provider for SqlServer”,NumberOfPooledConnections从未超过20左右。我还在SQL服务器上运行perfmon,监听“SQLServer:General Statistics”,UserConnections从未超过50。在此期间,我通过手动重新启动服务使此错误报告2或3次。

还能找什么?还有什么可能导致这个错误?完整的错误消息如下:

System.InvalidOperationException: Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()

谢谢,Stephen

1个回答

5
这是一个已知的bug,如此处所示。
微软在2008年8月15日发布了一份声明,感谢您的反馈。修复方案已提交到下一个主要的.NET版本的源代码分支。

谢谢,VMAtm。将Connect_Timeout从0更改为300似乎解决了问题。 - Stephen
该链接返回了HTTP 404错误。 - sharptooth
@sharptooth 微软发布修复程序时会清除他们的反馈。 我认为修复已经发布了。 - VMAtm
很奇怪,他们通常只会标记为“已修复”,然后它就会留在那里。 - sharptooth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接