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