【问题标题】:Does my .Net SqlConnection object close on its own我的 .Net SqlConnection 对象是否自行关闭
【发布时间】:2011-09-01 13:44:40
【问题描述】:

我们有一个简单的循环过程,可以在一些数据行上做一些事情。

当提交更改时,新行和 SqlConnection 对象被传递给处理行更改或添加的方法。

该过程运行 10 次中的 5 次,一切正常。 SqlConnection 在循环开始时打开并在循环后关闭,但有时它确实在循环期间关闭。代码在循环期间的任何时候都不会调用 close()。

所以我的问题是它为什么会自行关闭。

干杯

作为参考,代码类似于以下内容

connection.Open();

foreach(DataRow row in rows)
{
  if(rubbish)
{
   //make some changes and save
   DatabaseConnector.Save(sqlStringToExecute, connection);
}
}

connection.Close();

【问题讨论】:

  • 你能显示你的代码吗?它会让你的问题更清楚。
  • 也许您应该为每个操作使用多个连接?
  • 永远不要像上面那样做代码,如果发生任何事情并且抛出异常,您的连接将不会关闭,在您声明它的地方,使用 Using 语句,因此在任何情况下连接都将被关闭和处理超出范围时。
  • 连接真的关闭了吗(什么是异常或错误消息)?可能是(分布式)事务在下面超时了吗?可能是语句超时。

标签: .net sqlconnection


【解决方案1】:

连接不会自行关闭,不会。连接关闭的主要时间是:

  • 处置(例如通过using 声明)
  • 明确调用Close()
  • CommandBehaviour.CloseConnection 行为执行命令
  • 垃圾收集 - 一种(虽然这有点不同,真的)
  • 服务器不再可用

如果您实际上遇到异常(可能是超时或死锁)、在using 块中弹跳(处理它),并且可能吞下异常,则第一种可能性非常大。

第三个在善意的代码中是非常可能的。

要进行调查,您可以订阅StateChange 事件并在处理程序中添加断点;然后通过堆栈跟踪向后走,您会确切地知道是谁在关闭它,以及为什么。如果您使用超出此代码范围的连接,请记住也取消订阅。

【讨论】:

  • 真的和上面的例子一样简单。连接被传递给执行 sql 并退出的方法。有时在循环期间它是一个关闭的连接,再次运行应用程序就可以正常工作。堆栈跟踪等并跟随调用堆栈显示您在上面看不到的任何内容。这肯定很奇怪。
  • @Robert - 然后挂钩 StateChange 以找出原因
  • 你的意思是挂钩到连接的 statechanged 事件?
  • @robert 是的,我就是这个意思
  • 好的,我会这样做,下一场比赛是明天,所以我会好好照顾它,看看我能找到什么。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-29
相关资源
最近更新 更多