【问题标题】:Node-mysql stale connectionsNode-mysql 过时的连接
【发布时间】:2017-05-04 08:38:01
【问题描述】:

我有一个 node-mysql 应用程序,其中 mysql-pool 设置为:

var db = db.createPool({
    host     : (process.env.NODE_ENV == "development") ? config.db.dev.host : config.db.prod.host,
    user     : (process.env.NODE_ENV == "development") ? config.db.dev.uname : config.db.prod.uname,
    password : (process.env.NODE_ENV == "development") ? config.db.dev.passwd : config.db.prod.passwd,
    database : (process.env.NODE_ENV == "development") ? config.db.dev.dbname : config.db.prod.dbname,
    port     : (process.env.NODE_ENV == "development") ? config.db.dev.port : config.db.prod.port,
    connectionLimit    : 100,
    multipleStatements : true,
  acquireTimeout     : 10000,
});

经过几天的活动,我的应用程序开始累积陈旧的连接,我已经检查过在 mysql 中不存在 threadId 的连接

show processlist

我在每个查询完成执行后使用connection.release()。我每天会收到大约 50000 个 API 调用。

每当我使用db.getConnection()pool._allConnections.length 的连接时,我都会记录池属性逐渐增加到最大限制(在我的情况下为 100),然后应用程序将挂起任何使用 mysql 连接返回 502 Bad Gateway error 的 API 调用. db.getConnection() 之后甚至不会抛出任何错误。

MySql @@global.wait_timeout 设置为 300。

我在同一个应用程序中也使用了套接字和 redis,即使 mysql API 停止响应,它们也能继续正常工作。

任何人都可以分享对此的任何见解。提前致谢。

【问题讨论】:

    标签: mysql node.js connection-pooling pool node-mysql


    【解决方案1】:

    在这种情况下,您应该为您的 mysql 池增加连接限制。您一次与 mysql 的活动连接超过了您的连接限制,并且您的请求在 mysql 池可以为您分配连接之前过期。您也可以尝试增加超时限制。

    【讨论】:

    • 但是那些存在于池中但它们的 thread-id's 不在processlist 中的连接呢??
    猜你喜欢
    • 1970-01-01
    • 2011-10-07
    • 1970-01-01
    • 2018-01-08
    • 2013-02-18
    • 2016-11-12
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多