检测到SQL的非关闭连接

时间:2010-04-12 17:05:05

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

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

2 个答案:

答案 0 :(得分:4)

  • Sql不回收它们。它们是开放的,直到管理员或 - 从客户端强制关闭。
  • 这将是garbace收集连接对象。

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

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

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

答案 1 :(得分:3)

我知道你说你不想通过每一行代码,但由于连接可以传递(或不传递),你可能没有多少选择。可能有用的东西是使用这个正则表达式(仅在VS查找窗口中有效):

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

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

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