【问题标题】:Detect non-closed connections to SQL检测到 SQL 的非关闭连接
【发布时间】:2010-04-12 17:05:05
【问题描述】:

我在 ASP.net 中继承了一个非常大的项目 SQL 2005,并且发现了一些 SQL 连接没有关闭的地方——这很糟糕。如果不通过每一行代码,有没有办法检测连接是否没有关闭?性能计数器?作为后续行动 - SQL 如何回收未关闭的连接。我正在使用非池连接字符串。

【问题讨论】:

  • SqlConnection con = new SqlConnection() 但没有“使用”,而且很多没有 close()/异常块

标签: asp.net sql-server-2005 connection-string


【解决方案1】:
  • Sql 不会回收它们。它们一直处于打开状态,直到管理员或客户端强制关闭。
  • 这将是垃圾收集连接对象。

内存分析器可能是您最好的选择 - 尝试找出(丢失和未处理的)连接的来源。

对我来说,这看起来像是很糟糕的代码——因为在我编写过的所有 asp.net 应用程序中,连接只在代码中的一个点处处理。似乎有人在这里到处传播。

一个提示可能是:从那些陈旧的连接中查看 SQL。您应该能够检索到最后一条 sql 语句,这可能会提示您它们的来源。

【讨论】:

    【解决方案2】:

    我知道您说过您不想遍历每一行代码,但是由于可以传递(或不传递)连接,您可能没有太多选择。使用这个正则表达式可能会有所帮助(仅在 VS 查找窗口中有效):

    //matches any constructor call to SqlConnection    
    new:Zs*(System.)*(Data.)*(SqlClient.)*SqlConnection(\([0-9a-zA-Z]*\))
    

    这将帮助您找到连接初始化,这可能有助于加快速度。我认为 TomTom 是正确的,因为您可能正在处理具有高圈复杂度的蹩脚代码,因此如果没有目视检查,您可能不会找到所有情况。小心检查连接是否被传递。你可能会有一个痛苦的重构即将到来,但我保证它会得到回报。

    祝你好运,希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-17
      • 2015-07-20
      • 1970-01-01
      • 2016-05-15
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 2013-01-07
      相关资源
      最近更新 更多