我们在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重启中恢复?
P.S。:在我的开发箱(也运行IIS)上,当我进行相同的测试时,我得到相同的错误几次(当数据库开始加载时我猜)然后它再次开始工作。
答案 0 :(得分:1)
有时,您从池中获取的连接是新的(并且您的连接尝试成功),有时连接被重用并且连接尝试失败。并非所有被切断的连接都可以重复使用,因为pooler可能会或可能不会检测到这种情况并从池中删除这样的连接。
如果已经消失的服务器存在连接,即使连接池没有检测到被切断的连接并将其标记为无效,也可以从池中提取此连接。发生这种情况时,会生成异常。但是,您仍必须关闭连接才能将其释放回池中。
如果您很少创建连接,那么没有性能影响,最好关闭池。只需在连接字符串中将Pooling
设置为no
。