我想知道最佳實踐是什麼。我有一個處理大量流量的web服務。我們將盡快進行負載測試,但我想知道這是否會成爲問題。.NET Web Service讓許多MySQL連接與TIME_WAIT打開
該webservice有幾個類似於下面的功能(這是最簡單的,所以我用這個作爲我的例子)。每個函數都需要在MySQL數據庫上進行一些查詢。我正在使用MySQL ODBC 3.51驅動程序。連接字符串是這樣的:
「Driver = {MySQL ODBC 3.51 Driver}; Server = IPADDRESS; Database = DBNAME; UID = BLAH; Pwd = BLAH;」
每個函數都建立一個新的連接(使用USING語句)和reader,運行查詢並關閉連接和讀取器。
Public Function ServerTime() As String
Dim now As DateTime = DateTime.UtcNow
Using connection As New OdbcConnection(ConnectionString)
Dim command As OdbcCommand
command = New OdbcCommand("SELECT NOW()", connection)
connection.Open()
Dim reader As OdbcDataReader = command.ExecuteReader
If reader.HasRows Then
While reader.Read()
Dim dbtime As String = reader.GetValue(0).ToString()
DateTime.TryParse(dbtime, now)
End While
End If
reader.Close()
connection.Close()
End Using
Dim t As TimeSpan = now.ToUniversalTime() - New DateTime(1970, 1, 1)
Dim timestamp As Double = Math.Round(t.TotalMilliseconds)
Return timestamp.ToString()
End Function
此WebService捲起使得其當前負載下每秒2-3數據庫調用。同樣,並非所有的調用都來自上面的示例函數。有許多函數比這個更常用,但它們都以類似的方式運行數據庫事務。
即使在當前(比我們的目標輕很多)的負載下,在IIS服務器上運行netstat顯示仍有400個端口仍處於TIME_WAIT狀態。據我瞭解,他們保持開放約四分鐘。
有沒有更好的方式來處理數據庫連接,不會導致所有這些端口保持打開狀態?我已經看到我可以對TcpTimedWaitDelay進行註冊表更改以減少四分鐘的等待時間,但是我想知道是否可以一起避免這個問題而不是帶幫助。這會影響可擴展性。
在此先感謝。
也許這有助於:http://stackoverflow.com/questions/3523500/php-odbc-not-closing-connections – aconrad
這絕對是一個類似的問題,雖然他使用的是PHP而不是.NET。除了改變TcpTimedWaitDelay之外,他從未找到解決方案,這不是一個真正的解決方案,而是一種緩解措施。我問是否有辦法修改我的.NET代碼以解決服務器處理這些連接的方式。 – c4313622
。如果連接池被禁用,則Close()會關閉連接。也許odbc不關閉它,因爲它想重新使用它...我沒有看到任何方式來修改代碼,以避免這... – aconrad