【问题标题】:Node.js MySQL module, auto reconnect db on connection closeNode.js MySQL 模块,在连接关闭时自动重新连接数据库
【发布时间】:2018-10-12 19:46:54
【问题描述】:

我一直在使用这个 Node.js MySQL 模块来处理数据库。我的连接作为模块放置在单独的文件中。这是代码

let mysql = function connect(){
    return require('mysql').createConnection({
        hostname: 'localhost',
        user: 'root',
        password: 'root',
        database: 'chat_db'
    });
}
module.exports.connect = mysql;

我想稍微修改一下,这样,万一发生断开连接,它会自动重新连接

【问题讨论】:

    标签: node.js node-modules node-mysql


    【解决方案1】:

    您可以自己编写重新连接代码,但这可能需要一段时间才能正确完成,而且我认为这并不容易。我建议使用连接池来保持与 mysql 的多个连接打开并在需要时使用它们。这将允许您定期检查连接是否仍然存在,如果不是,则销毁/重新连接。管理一个池比管理一个非常重要的连接要容易得多。

    您正在使用的库中似乎存在连接池:

    这个模块不是一个一个地创建和管理连接,而是使用 mysql.createPool(config) 提供内置的连接池

    https://github.com/mysqljs/mysql#pooling-connections

    我成功使用的另一个池化选项是generic-pool。使用 generic-pool 的设置可能如下所示:

    const pool = require('generic-pool');
    const mysql = require('mysql');
    
    const connections = pool.createPool({
      create: (done) => {
        return mysql.createConnection({
          hostname: 'localhost',
          user: 'root',
          password: 'root',
          database: 'chat_db'
        }).connect(done);
      },
      destroy: connection => connection.destroy(),
      validate: connection => connection.threadId,
    }, {
      testOnBorrow: true,
      acquireTimeoutMillis: 10000,
      min: 1,
      max: size,
    });
    

    【讨论】:

    • 我对通用池使用了相同的配置。我创建了一个连接并做了一些查询。之后,我使用“show processlist;”从 mysql 中杀死了该进程,以模拟丢失的连接。但是当我在那之后进行查询时,它给了我一个错误“错误:连接丢失:服务器关闭了连接。”
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    • 2010-09-24
    • 1970-01-01
    • 2023-04-02
    • 2011-07-29
    • 2012-04-28
    相关资源
    最近更新 更多