我甚至不想提起这个问题,因为已经有数百页关于这个错误的讨论,追溯到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