我们有一个托管在 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)上,当我进行相同的测试时,我得到了几次相同的错误(我想是在开始加载数据库时),然后它又开始工作了。