5

我们有一个托管在 IIS 中的 WCF 服务,在服务器上运行。该服务连接到在另一台服务器上运行的 SQL Server 实例。在我们的代码中,我们为每个请求打开和关闭连接。WCF 服务每分钟向数据库发出多个请求。

如果我在不停止 WCF 服务的情况下重新启动 SQL 服务,WCF 服务会开始将错误记录到我们的错误日志中,这是完全正常的。

问题是有时(并非总是),在 SQL 服务重新启动后,WCF 服务会继续在每个请求上报告此错误:

Cannot open database "mydatabase" requested by the login. The login failed." 

错误的堆栈跟踪以:

at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
at System.Data.SqlClient.SqlConnection.Open()

发生这种情况时,我可以使用 SQL Management Studio(从运行 WCF 服务的同一台机器)连接到数据库。为了解决这个问题,我必须为我的 WCF 服务回收应用程序池。

所以我的问题是:什么会导致这种情况,我可以做些什么来确保我的应用程序可以从 SQL 重启中恢复?

PS:在我的开发箱(也运行 IIS)上,当我进行相同的测试时,我得到了几次相同的错误(我想是在开始加载数据库时),然后它又开始工作了。

4

1 回答 1

1

有时您从池中获得的连接是一个新连接(并且您的连接尝试成功),其他时候连接被重用并且连接尝试失败。并非所有被切断的连接实际上都会被重用,因为池化器可能会或可能不会检测到条件并从池中删除这样的连接。

从这里

如果存在与已消失的服务器的连接,则即使连接池程序没有检测到断开的连接并将其标记为无效,也有可能从池中提取此连接。发生这种情况时,会生成异常。但是,您仍然必须关闭连接才能将其释放回池中。

如果您很少创建连接,因此不会影响性能,最好关闭池化。只需在连接字符串中设置Pooling为。no

于 2012-05-16T22:07:50.180 回答