我有一个从DB2数据库(我们的主数据库)获取数据的应用程序,并将其作为我们的一个进程的一部分插入到SQL Server(报告类型数据库)中。
昨晚,我们从打开SQL Server连接时收到此错误:
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.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpenInner(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
这发生了几次,但之后我们的基于DB2的查询也开始计时(或者至少,我们开始达到已经建立的WCF超时)。
我想我知道SQL Server连接池问题的原因,但我不会猜到SQL Server问题会导致DB2方面的问题(我说的是完全独立的进程超时) DB2服务器)。
我的问题是:.NET是否每个ADO.NET提供程序都有一个连接池(我原本期望),还是所有连接(这个错误似乎表明)?
如果它有所不同,我们正在使用.NET TransactionScope
来保持DB2和SQL Server之间的事务同步。 This answer似乎表明TransactionScope
中使用的连接在范围结束之前不会被释放。