[英].NET Web Service leaving many MySQL connections open with TIME_WAIT
我想知道這是什么最佳實踐。 我有一個處理大量流量的Web服務。 我們將很快進行負載測試,但我想知道這是否會成為問題。
該Web服務具有類似於以下功能的幾個功能(這是最簡單的功能,因此我以該功能為例)。 每個函數都需要對MySQL數據庫進行一些查詢。 我正在使用MySQL ODBC 3.51驅動程序。 連接字符串如下所示:
“驅動程序= {MySQL ODBC 3.51驅動程序};服務器= IPADDRESS;數據庫= DBNAME; UID = BLAH; Pwd = BLAH;”
每個函數都建立一個新的連接(帶有USING語句)和閱讀器,運行查詢,並關閉連接和閱讀器。
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
該Web服務在當前負載下每秒完成2-3個數據庫調用。 同樣,並非所有調用都來自上述示例函數。 有許多功能遠不止此功能,但它們都以類似的方式運行數據庫事務。
即使在當前的負載下(比我們的目標要輕得多),在IIS服務器上運行netstat仍顯示有大約400個端口仍處於TIME_WAIT狀態。 據我了解,它們保持打開狀態約四分鍾。
有沒有更好的方法來處理數據庫連接,而不會導致所有這些端口保持打開狀態? 我已經看到我可以將注冊表更改為TcpTimedWaitDelay來減少四分鍾的等待時間,但是我想知道是否可以一起避免此問題,而不是避免使用帶助手。 這損害了可伸縮性。
提前致謝。
顯然,MySQL ODBC 3.51驅動程序未進行任何連接池。 我切換到使用Oracle的Connector / NET ,現在,它正確地建立了連接池,並且TIME_WAIT問題消失了。
唯一的缺點是,如果我的數據庫從MySQL遷移到MS SQL,這可能會在不久的將來發生,那么我將不得不進行一些小的代碼更改,而不僅僅是更改連接字符串。
那好吧。 問題解決了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.