.NET Web服务使用TIME_WAIT打开许多MySQL连接

时间:2014-01-14 18:00:26

标签: mysql .net database web-services

我想知道最佳做法是什么。我有一个处理大量流量的Web服务。我们很快就会进行负载测试,但我想知道这是否会成为一个问题。

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

这个网络服务最终在当前负载下每秒进行2-3次数据库调用。同样,并非所有调用都来自上面的示例函数。有许多函数比这个函数更常被调用,但它们都以类似的方式运行数据库事务。

即使在其当前(比我们的目标轻得多)负载下,在IIS服务器上运行netstat也会显示仍有400个端口处于TIME_WAIT状态。据我所知,它们会保持开放状态大约四分钟。

有没有更好的方法来处理不会导致所有这些端口保持打开的数据库连接?我已经看到我可以对TcpTimedWaitDelay进行注册表更改以减少四分钟的等待,但我想知道这个问题是否可以一起避免,而不是带状辅助。这会损害可扩展性。

提前致谢。

1 个答案:

答案 0 :(得分:0)

显然,MySQL ODBC 3.51驱动程序没有进行任何连接池。我转而使用Oracle的Connector / NET,现在,它正在正确地汇集连接,并且TIME_WAIT问题消失了。

唯一的缺点是,如果我的数据库从MySQL迁移到MS SQL(可能在不久的将来发生),我将不得不进行一些小的代码更改,而不仅仅是更改连接字符串。

好吧,好吧。问题解决了。