是什么导致SqlClient重用无效连接?

Syl*_*ain 5 sql-server ado.net sqlclient

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

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

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

Cannot open database "mydatabase" requested by the login. The login failed." 
Run Code Online (Sandbox Code Playgroud)

错误的堆栈跟踪结束于:

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()
Run Code Online (Sandbox Code Playgroud)

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

所以我的问题是:什么可以导致这个,我该怎么做才能确保我的应用程序可以从SQL重启中恢复?

PS:在我的开发盒(也运行IIS)上,当我进行相同的测试时,我得到相同的错误几次(当数据库开始加载时我猜)然后它再次开始工作.

Jir*_*ika 1

有时,您从池中获取的连接是新连接(并且您的连接尝试成功),有时,连接被重用并且连接尝试失败。并非所有断开的连接实际上都会被重用,因为池程序可能会也可能不会检测到该情况并从池中删除此类连接。

从这里

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

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