小白一枚,记录下在使用nodejs连接mysql的过程中出现的问题。
第一步,连接数据库,按照网上的操作,一切正常
const mysql = require('mysql');
// 创建连接池
const pool = mysql.createPool({
connectionLimit: 10,
// 其他配置...
});
// 执行查询
pool.query('SELECT 1 + 1 AS solution', (error, results, fields) => {
if (error) throw error;
console.log('The solution is: ', results[0].solution);
});
// 当你需要结束数据库连接时
pool.end((err) => {
if (err) {
// 处理连接结束时的错误
return;
}
console.log('All connections in the pool have ended.');
});
// 如果需要继续查询数据库,可以重新建立连接
pool.on('end', () => {
// 连接池结束时的回调,可以在这里重新连接
console.log('Connection pool has ended.');
// pool.connect(); // 可以在这里重新连接
});
测试没有问题,各种增删改都ok,哈皮又充实的一天。但是,第二天过来发现报错,Cannot enqueue Query after fatal error 。各种查资料,使用连接池,捣鼓一天,没有发现问题,似乎重启一下就全好了,结果第二天上班又报相同的错。这。。。忍不了啊,又是各种找资料的一天。终于,在不经意间发现了问题,mysql在无连接的情况下,默认会在8小时自动断开连接,敲重点,问题终于找到,难怪我一睡觉就给我搞事,原来是‘饿死了’。
问题找到,再处理就简单了。无非就两种,
一:修改mysql自动断开连接的时间,但是对于我这种几天可能都没有人访问的,不是好的解决方式。
二:修改代码,让mysql一直有连接在,一个简单的轮询解决。话不多说,上代码。
var pingInterval;
// 每个小时ping一次数据库,保持数据库连接状态
clearInterval(pingInterval);
pingInterval = setInterval(() => {
console.log('ping...');
db.ping((err) => {
if (err) {
console.log('ping error: ' + JSON.stringify(err));
}
});
}, 3600000);
哎,老鸟一眼看穿本质,菜鸟折腾了几天。又笨又菜,怕又忘了,记录下。