使用Xorm和Go-MySQL进行连接池
只是从github交叉发布。
我将xorm 0.4.3与go-mysql一起使用。我们使用Golang
1.4。
我们在maxIdleConnetions
和maxOpenConnections
中指定了xorm
以下内容:
var orm *xorm.Engine...
orm.SetMaxOpenConns(50)
orm.SetMaxIdleConns(5)
而且我们使用相同的单个xorm
实例来查询Mysql。
但是我们仍然看到很多连接的TCP Connection
Establised状态,这是远远超过这些数字我已经配置maxIdleConnetions
和maxOpenConnections
我们国家的时候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?
回答:
首先,Go 1.4太旧了。使用最新的Go 1.6。这个答案是用Go 1.6的知识编写的。因此,某些细节可能与您的情况有所不同。
连接有四种状态:连接,空闲,正在使用和关闭。MaxOpenConnections限制处于连接,空闲,使用状态的连接数。因此,如果您的应用程序关闭并快速重新打开连接,则可能会发生。
由于TCP是CLOSED_WAIT
MySQL服务器端的状态,因此您的应用正在等待EOF连接。我想您的应用负载很高,读取EOF和关闭连接的速度很慢。在读取EOF并关闭连接之前,无论服务器端的TCP状态如何,客户端的TCP状态都是已建立的。
我建议您更新Go和“ go-sql-driver /
mysql”,并设置MaxIdleConns等于MaxOpenConns以避免高重新连接率。相反,您可以使用SetConnMaxLifetime(Go
1.6中的新API)在应用程序空闲时关闭连接。
以上是 使用Xorm和Go-MySQL进行连接池 的全部内容, 来源链接: utcz.com/qa/433513.html