nodejs使用mysql模块自动断开

2024-06-23 1845阅读

背景

第二天早上来的时候,发现接口返回异常Cannot enqueue Query after fatal error

nodejs使用mysql模块自动断开
(图片来源网络,侵删)

从日志看上去,接口是正常运行的,搜索一下之后发现是数据库的问题,连接断开了

原因

MySQL中有一个名叫wait_timeout的变量,表示操作超时时间,当连接超过一定时间没有活动后,会自动关闭该连接,这个值默认为28800(即8小时)。对于这种普通连接的方式,在正式线上可能会遇到连接丢失的问题(No reconnection after connection lost错误日志),连接丢失后不会自动重新连接,会触发error事件。

解决方案

我从网上尝试了好几种,有些自测不行,有些可以,我都列出来

  1. 连接配置中增加useConnectionPooling: true,这个我尝试了不行
let dbconfig = {
  host: "db_host",
  user: "db_user",
  password: "db_pass",
  database: "db_name",
  useConnectionPooling: true,
  debug: true,
};
  1. 捕获全局异常,判断code为PROTOCOL_CONNECTION_LOST,然后进行重启mysql,这个我也尝试了不行
process.on("uncaughtException", function (err) {
  if (err.code == "PROTOCOL_CONNECTION_LOST") {
    mysql.restart();
  }
});

适用于还有另一个报错的情况,Error: Connection lost The server closed the connection

  1. 监听连接报错,然后重连,这个可以
function handleError(err) {
  if (err) {
    // 如果是连接断开,自动重新连接
    if (err.code === "PROTOCOL_CONNECTION_LOST") {
      connect();
    } else {
      console.error(err.stack || err);
    }
  }
}
// 连接数据库
function connect() {
  db = mysql.createConnection(config);
  db.connect(handleError);
  db.on("error", handleError);
}
var db;
connect();
  1. 使用连接池的方式,每次查询完成之后释放连接池,这个也可行
var mysql = require("mysql");
var pool = mysql.createPool(config);
pool.getConnection(function (err, connection) {
  connection.query("SELECT something FROM sometable", function (err, rows) {
    connection.end();
  });
});
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]