2012-05-16 51 views
5

我们有一个WCF服务托管在IIS中,运行在服务器上。该服务连接到另一台服务器上运行的SQL Server实例。在我们的代码中,我们打开并关闭每个请求的连接。 WCF服务每分钟向数据库发出几个请求。什么会导致SqlClient重用无效连接?

如果我在不停止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重新启动恢复?在我的开发盒(也运行IIS)上,当我做同样的测试时,我几次得到相同的错误(当数据库开始加载时,我想),然后它再次开始工作。

+0

您可能希望尝试捕获SqlException并检查特定的错误代码,然后调用SqlConnection.ClearPool(sqlConnection);然后再重试一次该声明 – Termit

回答

1

有时,您从池中获得的连接是新连接(并且连接尝试成功),其他时间连接重用并且连接尝试失败。并非所有被切断的连接实际上都被重用,因为池可能会或可能不会检测到这种情况并从池中移除这样的连接。

From here

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

如果您很少创建连接,这样就没有性能影响,最好关闭连接。只需在连接字符串中设置Poolingno即可。

相关问题