关于Nodejs链接mysql超时的问题

关于Nodejs链接mysql超时的问题

最近线上的进程总是自己挂掉,查看nohup.out文件,发现是mysql链接久了,超时自动关闭链接了,网上搜索了一些解决办法,可依然没有解决。求大神帮忙,谢啦!

<code>Error: Connection lost: The server closed the connection. </code>

下面是我的代码:
<pre>var mq = require(“mysql”); global.mc = mq.createConnection({ host:“192.168.1.113”, user: “root”, password: “root” }); var connectionState = false; function connectMySql(){ mc.connect(function(err){ if(err){ console.log(‘SQL connect err:’+err); connectionState = false; } else{ console.log(‘SQL connect successful!’); connectionState = true; } }); mc.on(‘close’, function (err) { logger.error(‘mysqldb conn close’); connectionState = false; }); mc.on(‘error’, function (err) { logger.error('mysqldb error: ’ + err); connectionState = false; }); } connectMySql(); var dbConnChecker = setInterval(function(){ if(!connectionState){ connectMySql(); } },500);</pre>


6 回复

针对你遇到的 Node.js 连接 MySQL 超时的问题,我们可以从几个方面来解决这个问题。首先,我们需要确保连接配置正确,并且在连接丢失后能够自动重连。

解决方案

  1. 配置 autoReconnect 选项:MySQL 驱动支持一个名为 autoReconnect 的配置项,可以在连接对象中启用它。这将使得连接在断开后尝试自动重新连接。

  2. 设置连接超时时间:可以调整连接的超时时间,以适应你的应用需求。

  3. 错误处理和日志记录:确保错误被妥善处理,并且有适当的日志记录以便于调试。

示例代码

const mysql = require('mysql');

// 创建连接池,推荐使用连接池而不是单个连接
const pool = mysql.createPool({
    host: '192.168.1.113',
    user: 'root',
    password: 'root',
    database: 'your_database', // 添加数据库名称
    connectionLimit: 10,      // 最大连接数
    waitForConnections: true, // 当无空闲连接时,等待新连接
    queueLimit: 0,            // 无限队列
    acquireTimeout: 30000,    // 获取连接的最大等待时间(毫秒)
    idleTimeoutMillis: 30000, // 空闲连接的超时时间(毫秒)
    connectionTimeout: 30000, // 连接建立的最大等待时间(毫秒)
    multipleStatements: true, // 支持多语句执行
    autoReconnect: true       // 自动重连
});

// 检查连接状态并重新连接
function checkAndReconnect() {
    pool.getConnection((err, connection) => {
        if (err) {
            console.error('Database connection failed: ' + err.stack);
            return;
        }
        console.log('Connected as id ' + connection.threadId);

        // 使用完连接后释放
        connection.release();

        // 设置定时器每分钟检查一次连接状态
        setTimeout(checkAndReconnect, 60000);
    });
}

// 初始连接
checkAndReconnect();

// 使用连接池进行查询
pool.query('SELECT * FROM your_table', (error, results, fields) => {
    if (error) throw error;
    console.log(results);
});

关键点解释

  • 连接池:使用连接池而非单个连接可以更好地管理资源,避免频繁创建和销毁连接带来的性能损耗。
  • autoReconnect:启用自动重连功能,当连接丢失时会尝试重新连接。
  • waitForConnectionsqueueLimit:这些配置项用于控制连接池的行为,如等待新连接或拒绝新请求。
  • 错误处理:确保错误被捕获并记录,以便于排查问题。

通过以上改进,你应该能有效解决连接超时的问题,并提高应用的稳定性和可靠性。


用连接池来管理数据库连接吧 https://github.com/coopernurse/node-pool

你用的是这个吧,https://github.com/felixge/node-mysql 如果你用的是这个你可以看下他的例子, 不过我也是推荐你是用连接池。他的例子都还是比较详细的。

谢啦!

刚看了一下连接池的使用方法,感觉不错,就用它了!非常感谢

根据你描述的情况,MySQL 连接超时并断开连接的问题通常可以通过调整 MySQL 的配置以及 Node.js 中的连接配置来解决。你可以尝试以下几种方法:

1. 调整 MySQL 配置

在 MySQL 的配置文件 my.cnfmy.ini 中,可以设置一些参数以延长连接超时时间。例如:

[mysqld]
wait_timeout = 28800  # 设置为8小时
interactive_timeout = 28800  # 同样设置为8小时

2. 在 Node.js 中配置连接

你可以通过设置 connectTimeoutacquireTimeout 等选项来避免连接超时问题。以下是修改后的代码示例:

const mysql = require('mysql');

// 创建 MySQL 连接池
const pool = mysql.createPool({
  host: '192.168.1.113',
  user: 'root',
  password: 'root',
  database: 'your_database', // 添加数据库名称
  connectTimeout: 60000,   // 连接超时时间(毫秒)
  acquireTimeout: 60000,   // 获取连接超时时间(毫秒)
});

function query(sql, params) {
  return new Promise((resolve, reject) => {
    pool.query(sql, params, (err, results) => {
      if (err) return reject(err);
      resolve(results);
    });
  });
}

// 示例查询
query('SELECT * FROM your_table', [])
  .then(results => console.log(results))
  .catch(err => console.error(err));

3. 使用连接池

使用连接池可以更好地管理连接,并且避免频繁地创建和销毁连接。以上代码已经使用了连接池。

4. 定期检查连接状态

尽管已经在你的代码中实现了定期检查连接状态,但建议直接使用连接池来管理连接,这将简化代码并提高效率。

希望这些解决方案能帮助你解决问题。如果还有其他问题,请随时告知。

回到顶部