Node.js连接MySQL出现PROTOCOL_CONNECTION_LOST错误求助
解决MySQL闲置导致的
PROTOCOL_CONNECTION_LOST错误 这个PROTOCOL_CONNECTION_LOST错误我太熟悉了——确实是MySQL服务器把长时间闲置的连接给主动关闭了。下面给你几个实用的解决方案,从代码调整到服务器配置都有,你可以根据自己的场景选择:
方案1:开启连接自动重连并监听错误
在创建单连接的时候,开启自动重连选项,同时监听连接错误事件,一旦检测到连接丢失就主动重连:
const mysql = require('mysql'); const connection = mysql.createConnection({ host: '你的数据库地址', user: '数据库用户名', password: '数据库密码', database: '目标数据库', reconnect: true // 开启自动重连 }); // 监听连接错误,处理丢失的情况 connection.on('error', function(err) { if (err.code === 'PROTOCOL_CONNECTION_LOST') { console.log('数据库连接丢失,正在尝试重新连接...'); connection.connect(); } else { // 其他错误直接抛出,方便排查 throw err; } });
方案2:改用连接池管理连接(推荐生产环境使用)
连接池会自动维护连接的生命周期,闲置超时的连接会被自动回收或重建,不用手动处理重连问题,这是更稳定的方案:
const mysql = require('mysql'); const pool = mysql.createPool({ host: '你的数据库地址', user: '数据库用户名', password: '数据库密码', database: '目标数据库', connectionLimit: 10, // 连接池最大连接数,根据业务调整 idleTimeoutMillis: 30000 // 闲置连接超时时间,建议小于MySQL的wait_timeout }); // 从连接池获取连接执行查询 pool.getConnection(function(err, connection) { if (err) throw err; connection.query('SELECT * FROM 你的表名', function(error, results) { connection.release(); // 用完连接记得释放回池 if (error) throw error; console.log('查询结果:', results); }); });
方案3:调整MySQL服务器的超时配置
如果不想修改代码,可以延长MySQL服务器允许连接闲置的时间。注意这个设置会影响所有数据库连接,要根据服务器资源合理调整:
- 临时生效(重启MySQL后失效):
登录MySQL执行以下SQL:SET GLOBAL wait_timeout = 86400; -- 设置为24小时,单位是秒 SET GLOBAL interactive_timeout = 86400; - 永久生效:
找到MySQL的配置文件(Linux是my.cnf,Windows是my.ini),在[mysqld]节点下添加:
保存后重启MySQL服务即可。[mysqld] wait_timeout = 86400 interactive_timeout = 86400
方案4:定期发送心跳查询保持连接活跃
在应用层定时发送一个简单的查询(比如SELECT 1),让连接保持活跃,避免被MySQL判定为闲置关闭:
// 每5分钟发送一次心跳,时间要小于MySQL的wait_timeout setInterval(function() { connection.query('SELECT 1', function(err) { if (err) { console.log('心跳查询失败,尝试重新连接...'); connection.connect(); } }); }, 300000); // 300000毫秒 = 5分钟
内容的提问来源于stack exchange,提问作者Srinivasa K C
相关产品推荐
相关产品推荐

