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
相关产品推荐
相关产品推荐

