gpt4 book ai didi

sql-server - 什么会导致 SqlClient 重用无效连接?

转载 作者:行者123 更新时间:2023-12-03 00:50:00 25 4
gpt4 key购买 nike

我们有一个 WCF 服务托管在 IIS 中,在服务器上运行。该服务连接到另一台服务器上运行的 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)上,当我进行相同的测试时,我会多次遇到相同的错误(我想是在数据库开始加载时),然后它再次开始工作。

最佳答案

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

From here :

If a connection exists to a server that has disappeared, it is possible for this connection to be drawn from the pool even if the connection pooler has not detected the severed connection and marked it as invalid. When this occurs, an exception is generated. However, you must still close the connection in order to release it back into the pool.

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

关于sql-server - 什么会导致 SqlClient 重用无效连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10625234/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com