2014-01-14 32 views
0

我想知道最佳實踐是什麼。我有一個處理大量流量的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進行註冊表更改以減少四分鐘的等待時間,但是我想知道是否可以一起避免這個問題而不是帶幫助。這會影響可擴展性。

在此先感謝。

+0

也許這有助於:http://stackoverflow.com/questions/3523500/php-odbc-not-closing-connections – aconrad

+0

這絕對是一個類似的問題,雖然他使用的是PHP而不是.NET。除了改變TcpTimedWaitDelay之外,他從未找到解決方案,這不是一個真正的解決方案,而是一種緩解措施。我問是否有辦法修改我的.NET代碼以解決服務器處理這些連接的方式。 – c4313622

+0

。如果連接池被禁用,則Close()會關閉連接。也許odbc不關閉它,因爲它想重新使用它...我沒有看到任何方式來修改代碼,以避免這... – aconrad

回答

0

顯然,MySQL的ODBC 3.51驅動程序沒有做任何連接池。我切換到使用Oracle的Connector/NET,現在它正在合併連接並且TIME_WAIT問題消失。

唯一的缺點是,如果我的數據庫從MySQL移到MS SQL,這可能在不久的將來發生,我將不得不做一些小的代碼更改,而不僅僅是更改連接字符串。

唉。問題解決了。