【问题标题】:Connection pooling with xorm and go-mysql使用 xorm 和 go-mysql 进行连接池
【发布时间】:2016-07-24 16:48:10
【问题描述】:

只是从github 交叉发布。

我正在使用 xorm 0.4.3 和 go-mysql。我们正在使用 Golang 1.4。

我们在xorm 中指定了maxIdleConnetionsmaxOpenConnections 如下:-

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

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

但我们仍然在TCP Connection Establised 状态看到很多连接,这远远超过我在lsof 时在maxIdleConnetionsmaxOpenConnections 状态配置的数字:-

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 进程列表中,它显示了我在 maxIdleConnetionsmaxOpenConnections 中指定的正确连接数。

有人可以解释一下这种行为吗?为什么即使我们将maxIdleConnetionsmaxOpenConnections 分别指定为 5 和 50,我们仍然观察到如此多的 TCP 连接?

【问题讨论】:

    标签: go


    【解决方案1】:

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

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

    由于 TCP 在 MySQL 服务器端处于CLOSED_WAIT 状态,因此您的应用正在等待来自连接的 EOF。我想您的应用程序负载非常高 读取EOF和关闭连接的速度很慢。在读取 EOF 并关闭连接之前,客户端的 TCP 状态是 ESTABLISHED,而不管服务器端的 TCP 状态。

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

    【讨论】:

    • 是的,只有在应用程序负载过重时才能看到这一点是正确的。但我的疑问是,即使我已将maxOpenConnections 指定为 50。但在负载下,我在ESTABLISHED 状态下看到打开的连接也超过 50,正如我在我的问题中发布的那样。但是在 mysql 进程列表中显示为 50。为什么会这样?
    • 您的应用程序将 COM_CLOSE 数据包发送到 MySQL。 MySQL 关闭连接。但是您的应用程序还没有读取 EOF。 TCP 连接处于 ESTABLISHED 状态,直到应用程序读取 EOF。由于您的应用负载很重,因此您的应用无法快速读取 EOF。
    • 你能用 cmets 更新你的答案吗?最后一个查询如果我将maxIdleConnections 设置为等于maxOpenConnection 会有什么帮助?
    • > 你能用 cmets 更新你的答案吗?我做的。 > 最后一个查询如果我将 maxIdleConnections 设置为等于 maxOpenConnection 会有什么帮助?它已经解释了我的答案:“避免高重新连接率”。我不想解释为什么小的 maxIdleConns 会导致高重连率。如果仔细考虑,每个人都应该注意到它。
    猜你喜欢
    • 1970-01-01
    • 2016-06-03
    • 2016-05-19
    • 2023-03-27
    • 1970-01-01
    • 2023-03-06
    • 2013-01-06
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多