2010-04-12 120 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是正確的,因爲你可能正在處理具有高圈複雜度的蹩腳代碼,所以如果沒有目視檢查,你可能不會找到每個案例。小心檢查連接是否被傳遞。你可能會有一個痛苦的重構來臨,但我保證它會以黑桃的形式回報。

祝你好運,希望這有助於!