我们有一些客户端代码使用 .NET 中的 SqlConnection 类与 SQLServer 数据库通信。它间歇性地失败并出现此错误:
“ExecuteReader 需要一个打开且可用的连接。连接的当前状态为已关闭”
“临时”解决方案是重新启动进程,之后一切正常 - 但是,这显然不能令人满意。
该代码保留了 SqlConnection 实例的缓存,每个数据库一个。
我们想重写代码,但在我这样做之前,我需要知道一些事情:
我的第一个问题是:反复连接和断开SqlConnection对象是效率低下,还是底层库代表我们执行连接池?
// Is this bad/inefficient?
for(many-times)
{
using(SQLConnection conn = new SQLConnection(connectionString))
{
// do stuff with conn
}
}
因为我们的代码没有执行上述操作,所以问题的可能原因似乎是在连接的“生命周期”期间底层 SQLServer 数据库发生了一些事情,导致连接关闭......
如果事实证明“缓存”SqlConnection 对象是值得的,那么推荐的方法是处理所有可以通过“重新连接”到数据库来解决的错误。我说的是这样的场景:
- 数据库已脱机并重新联机,但发生这种情况时客户端进程没有打开的事务
- 数据库“断开连接”,然后“重新连接”
我注意到 SqlConnection 上有一个“状态”属性......有没有合适的方法来查询它?
最后,我设置了一个具有完全访问权限的测试 SQLServer 实例:我怎样才能重现确切的错误“ExecuteReader 需要一个打开且可用的连接。连接的当前状态是关闭”