首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用xorm和go-mysql的连接池

使用xorm和go-mysql的连接池
EN

Stack Overflow用户
提问于 2016-07-19 09:46:42
回答 1查看 1.7K关注 0票数 0

只要把这个从github上交叉贴出来就行。

我在go-mysql中使用xorm0.4.3。我们上的是戈朗1.4。

我们已将maxIdleConnetionsmaxOpenConnectionsxorm中指定如下:

代码语言:javascript
复制
var orm *xorm.Engine
...
orm.SetMaxOpenConns(50)
orm.SetMaxIdleConns(5)

我们使用同一个xorm实例来查询Mysql。

但是,我们仍然可以看到TCP Connection Establised状态下的大量连接,这远远超过了我在maxIdleConnetionsmaxOpenConnections状态中配置的数字,当我们lsof:-

代码语言:javascript
复制
app 8747 10568 sandeshsharma 16u IPv4 691032 0t0 TCP 127.0.0.1:57337->127.0.0.1:mysql (ESTABLISHED)

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

代码语言:javascript
复制
app 8747 10844 sandeshsharma 38u IPv4 505058 0t0 TCP 127.0.0.1:54160->127.0.0.1:mysql (CLOSE_WAIT)

但是,在mysql中,它显示的是我在maxIdleConnetionsmaxOpenConnections中指定的正确连接数。

有人能解释一下我的这种行为吗?为什么我们要观察这么多TCP连接,即使我们分别将maxIdleConnetionsmaxOpenConnections分别指定为5和50呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-21 09:06:24

首先,走1.4太老了。使用最新的Go 1.6。这个答案是用Go 1.6的知识写的。所以在你的情况下,一些细节可能是不同的。

连接有四种状态:连接、空闲、不使用和关闭。MaxOpenConnections在连接状态、空闲状态、使用状态下限制连接的数量。因此,如果应用程序关闭并快速重新打开连接,则可能发生这种情况。

因为TCP是CLOSED_WAIT服务器端的MySQL状态,所以您的应用程序正在等待来自连接的EOF。我想你的应用程序负载很高,读取EOF和关闭连接的速度很慢。在读取EOF和关闭连接之前,TCP状态将在客户端建立,而不管服务器端的TCP状态如何。

我建议您更新Go和“go驱动程序/mysql”,并将MaxIdleConns设置为MaxOpenConns,以避免重新连接速率过高。相反,您可以使用SetConnMaxLifetime (Go1.6中的新API )在应用程序空闲时关闭连接。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38454970

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档