2010-05-21 51 views
0

我有一個很大的問題。 看看這個示例代碼MySqlConnection真的不關閉

private sub FUNCTION1() 
     dim conn as new mysqlconnection(myconnstring) 
     conn.open 
     ---- do something 
     FUNCTION2() 
     ---- 
     conn.close 
end sub 

private sub FUNCTION2() 
    dim conn as new mysqlconnection(myconnstring) 
    .... 
    conn.open 
    -- do something 
    conn.close 
end sub 

儘管我關閉regulary我所有的連接,他們仍然在MySQL服務器上的「打開」。 我知道這一點,因爲我使用MySQL管理工具來檢查我的源代碼「逐行」打開的連接數。 事實上,我得到了很多時間「用戶已超過'max_user_connections'資源(當前值:5)」 我的主機只允許5個連接,但我認爲如果我編寫GOOD源代碼,這不會是一個問題。 所以我的問題是:爲什麼那個「該死的」連接保持開放? 提前謝謝!

回答

1

考慮在Using聲明包裝你的MySqlConnection操作...

你實例化Using ... new語句中會被編譯器妥善處置的任何對象。一旦出現End Using聲明,該對象將退出scop。正常情況下,開發人員需要處置在Using塊中聲明的任何對象。

Using conn As New MySqlConnection(myConnString) 
    Using cmd As New MySqlCommand("SELECT * FROM Employees", conn) 
    conn.Open() 
     Using rdr As MySqlDataReader = cmd.ExecuteReader() 
     While rdr.Read() 
      Console.WriteLine(rdr(0)) 
     End While 
     End Using 
    End Using 
End Using 

在這種情況下,你沒有包住自己Using你的指揮和閱讀器,但它可以讓你利用它們都實現IDisposable的事實。

+0

嗨坎貝爾,如果我使用「使用」statemnet只爲連接會發生什麼?讀者和命令是否會在使用說明結束後處理? – stighy 2010-05-24 12:56:12

+0

該解決方案解決了與asp.net mysql連接器的連接問題。 – Steve 2012-12-28 02:31:46

0

嘗試調用conn.Dispose(),然後將其設置爲null。 在另一個說明中,您是否在Function1和Function2中打開連接,因爲看起來您正在創建2個連接。如果是這種情況,請嘗試實施單例模式來管理您的連接。