一尘不染

使用Xorm和Go-MySQL进行连接池

go

只是从github交叉发布。

我将xorm 0.4.3与go-mysql一起使用。我们使用Golang
1.4。

我们在maxIdleConnetionsmaxOpenConnections中指定了xorm以下内容:

var orm *xorm.Engine
...
orm.SetMaxOpenConns(50)
orm.SetMaxIdleConns(5)

而且我们使用相同的单个xorm实例来查询Mysql。

但是我们仍然看到很多连接的TCP Connection Establised状态,这是远远超过这些数字我已经配置maxIdleConnetionsmaxOpenConnections
我们国家的时候lsof-

app 8747 10568 sandeshsharma 16u IPv4 691032 0t0 TCP 127.0.0.1:57337->127.0.0.1:mysql (ESTABLISHED)

我们还观察到,即使我们停止MySQL,连接号仍保持固定但处于CLOSED_WAIT状态。如果我们关闭应用程序,则所有连接都会消失。

app 8747 10844 sandeshsharma 38u IPv4 505058 0t0 TCP 127.0.0.1:54160->127.0.0.1:mysql (CLOSE_WAIT)

但是在mysql进程列表中,它显示的连接数正确,正如我在maxIdleConnetions和中指定的那样 maxOpenConnections

有人可以解释一下这种行为吗?为什么我们要观察,即使我们已经指定了这么多的TCP连接maxIdleConnetions,并maxOpenConnections分别5
50?


阅读 1292

收藏
2020-07-02

共1个答案

一尘不染

首先,Go 1.4太旧了。使用最新的Go 1.6。这个答案是用Go 1.6的知识编写的。因此,某些细节可能与您的情况有所不同。

连接有四种状态:连接,空闲,正在使用和关闭。MaxOpenConnections限制处于连接,空闲,使用状态的连接数。因此,如果您的应用程序关闭并快速重新打开连接,则可能会发生。

由于TCP是CLOSED_WAITMySQL服务器端的状态,因此您的应用正在等待EOF连接。我想您的应用负载很高,读取EOF和关闭连接的速度很慢。在读取EOF并关闭连接之前,无论服务器端的TCP状态如何,客户端的TCP状态都是已建立的。

我建议您更新Go和“ go-sql-driver /
mysql”,并设置MaxIdleConns等于MaxOpenConns以避免高重新连接率。相反,您可以使用SetConnMaxLifetime(Go
1.6中的新API)在应用程序空闲时关闭连接。

2020-07-02