2010-04-12 64 views
3

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

+1

难道是ADO.NET吗? – 2010-04-12 17:09:28

+0

SqlConnection con = new SqlConnection() 但没有使用,许多没有close()/异常块 – JoeJoe 2010-04-13 20:09:02

回答

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

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

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

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

3

我知道你说你不想经历每一行代码,但由于连接可以传递(或不传递),你可能没有太多的选择。一些可能有助于使用此正则表达式(仅适用于VS找到窗口):

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

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

祝你好运,希望这有助于!