You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS循环操作MySQL报错:调用quit后无法入队Handshake

解决MySQL连接循环中"Cannot enqueue Handshake after invoking quit"错误

首先直接点出问题核心:你遇到的错误根源是复用了一个已经被彻底关闭的连接实例。

你在循环外创建了MySQL_Connection这个单一连接对象,第一次循环调用end()后,这个连接就被终止了——MySQL驱动不允许对已经调用过end()的连接再次执行connect()操作,这就是报错的原因。

下面给你两种可行的解决方案,按需选择:

方案一:每次循环创建新的连接实例

如果你的循环次数不多(比如示例里的5次),可以把连接创建逻辑放到循环内部,每次生成一个全新的连接:

var MySQLModule = require('mysql');
var i = 0;
while (i < 5) {
  // 每次循环初始化新的连接
  var MySQL_Connection = MySQLModule.createConnection({
    host: '10.0.0.254', 
    user: 'User', 
    password: 'Password', 
    database: 'Air_Pollution_Project'
  });
  
  MySQL_Connection.connect(err => {
    if (err) {
      console.error('连接失败:', err);
      return;
    }
    // 执行插入并处理结果/错误
    MySQL_Connection.query(
      'INSERT INTO Air_Pollution_Reading_Record (Station_ID, Air_Pollution_Reading_Value) VALUES (2, 666)',
      (err, results) => {
        if (err) {
          console.error('插入失败:', err);
        } else {
          console.log(`第${i+1}次插入成功`);
        }
        // 确保操作完成后关闭连接
        MySQL_Connection.end();
      }
    );
  });
  i++;
};

⚠️ 注意:这种方式每次循环都创建、销毁连接,频繁操作会有性能损耗,只适合小批量插入场景。

方案二:使用连接池(推荐)

对于需要多次数据库操作的场景,官方更推荐使用连接池——它会自动管理连接的复用、创建和销毁,既避免了重复创建连接的开销,也不会出现你遇到的连接复用错误:

var MySQLModule = require('mysql');
// 初始化连接池,可根据业务调整连接数上限
var pool = MySQLModule.createPool({
  host: '10.0.0.254', 
  user: 'User', 
  password: 'Password', 
  database: 'Air_Pollution_Project',
  connectionLimit: 10
});

var i = 0;
while (i < 5) {
  // 从连接池获取可用连接
  pool.getConnection((err, connection) => {
    if (err) {
      console.error('获取连接失败:', err);
      return;
    }
    // 执行插入操作
    connection.query(
      'INSERT INTO Air_Pollution_Reading_Record (Station_ID, Air_Pollution_Reading_Value) VALUES (2, 666)',
      (err, results) => {
        // 操作完成后释放连接回池(不是关闭)
        connection.release();
        if (err) {
          console.error('插入失败:', err);
        } else {
          console.log(`第${i+1}次插入成功`);
        }
      }
    );
  });
  i++;
};

这里要注意:connection.release()是把连接放回池里供后续复用,而不是直接关闭,这也是连接池高效的原因。

另外补充一个小细节:你的原代码没有处理异步操作的回调,可能会出现操作顺序混乱或者错误被忽略的情况,上面的示例都加上了错误处理和回调逻辑,建议实际开发中一定要保留这类处理,避免隐藏问题。

内容的提问来源于stack exchange,提问作者Marc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:53:18