繁体   English   中英

.NET Web服务通过TIME_WAIT打开许多MySQL连接

[英].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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM