nodejs使用mysql模块自动断开

背景

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

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

原因

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();});
});

实际代码

// pool.js
const mysql = require("mysql");
const { logger } = require(process.cwd() + "/middleware/log.js");
const configObj = require("./config");const pool = mysql.createPool({connectionLimit: 10, // 设置连接池限制...configObj,
});pool.on("connection", (connection) => {console.log("数据库连接成功!");
});pool.on("error", (err) => {logger(JSON.stringify({msg: "数据库错误",error: err.message,}));if (err.code === "PROTOCOL_CONNECTION_LOST") {console.log("数据库连接丢失,尝试重新连接...");pool.on("connection");} else {throw err; // 未处理的错误}
});module.exports = pool;
// sql.js
const { logger } = require(process.cwd() + "/middleware/log.js");
const pool = require("./pool");function RunSQL(query, params) {return new Promise((resolve, reject) => {pool.getConnection((err, connection) => {if (err) {reject(err);return;}connection.query(query, params, (err, results) => {connection.release();if (err) {reject(err);return;}resolve(results);});connection.on("error", (err) => {console.error("数据库连接错误: ", err);if (err.code === "PROTOCOL_CONNECTION_LOST") {console.log("数据库连接丢失,尝试重新连接...");logger(JSON.stringify({msg: "数据库连接失败",error: err.message,}));pool.on("connection");}});});});
}module.exports = RunSQL;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/36478.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

由监官要求下架docker hub镜像导致无法正常拉取镜像

问题:下载docker镜像超时 error pulling image configuration: download failed after attempts6: dial tcp 202.160.128.205:443: i/o timeout解决办法:配置daemon.json [rootbogon aihuidi]# cat /etc/docker/daemon.json {"registry-mirrors&qu…

java springboot过滤器

在Spring Boot应用中添加自定义过滤器,可以通过实现Filter接口或继承OncePerRequestFilter类来创建过滤器,并使用FilterRegistrationBean将其注册到Spring容器中。 以下是一个简单的示例: 1. 创建过滤器类 首先,创建一个实现Fil…

C++基础语法:类构造函数

前言 "打牢基础,万事不愁" .C的基础语法的学习 引入 类是实现面向对象思想的主要方法.前面提到:类是函数的变种,类可以通过调用静态方法或者成员函数来实现逻辑.多数情况下使用成员函数.构造函数是生成类对象成员的必须条件,对此做一些构造函数的归纳 构造函数的目…

【日志消息类的编写】

日志消息类编写 由于上篇的代码比较简单,今天就多写两段代码顺便把日志消息类编写完成。 这个类的实现就是:什么时间,哪个线程,哪个文件的哪一行,发生了什么等级的日志,日志机器名字是什么,日…

20240628 每日AI必读资讯

📚 Hugging Face 推出新版开源大模型排行榜,中国模型 Qwen-72B 夺冠 - 阿里Qwen-2-72B指令微调版本问鼎全球开源大模型排行榜榜首 - Llama-3-70B 微调版本排名第二,而 Mixtral-8x22B 微调版本位居第四。 - 另外,微软的 Phi-3-M…

三种分布式锁实现方式

目录 1、数据库自增 2、Redis自增 3、Zookeeper 4、其他 4.1、雪花算法 4.2、Tinyid 4.3、Leaf 4.4、数据库号段 1、数据库自增 利用数据库表的自增特性,或主键唯一性,实现分布式ID REPLACE INTO id_table (stub) values (’a‘) ; SELECT LA…

社交App广告优化新篇章:Xinstall引领用户体验升级,助力买量效果提升

随着移动互联网的快速发展,社交App已经成为人们生活中不可或缺的一部分。然而,在竞争激烈的市场环境下,如何有效地进行广告投放,吸引并留住用户,成为了每个社交App运营者面临的重大挑战。今天,我们就来谈谈…

自费5K,测评安德迈、小米、希喂三款宠物空气净化器谁才是高性价比之王

最近,家里的猫咪掉毛严重,简直成了一个活生生的蒲公英,家中、空气中各处都弥漫着猫浮毛甚至所有衣物都覆盖着一层厚厚的猫毛。令人难以置信的是,有时我甚至在抠出的眼屎中都能发现夹杂着几根猫毛。真的超级困扰了。但其实最空气中…

Packer-Fuzzer一款好用的前端高效安全扫描工具

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与学习之用,读者将信息做其他用途,由Ta承担全部法律及连带责任,文章作者不承担任何法律及连带责任。 1、Packer Fuzzer介绍 Packer Fuzzer是一款针对Webpack…

4.if 条件判断

1.if-else语句 if #判断条件 :pass else:pass2.if - elif- else if #判断条件 :pass elif #判断条件:pass else:pass3.if语句可以嵌套 if #判断条件 :passif #判断条件 :pass 4.逻辑运算符 and 两个都为真,才是真 or 一个为真 即是真 not 取反 and从左到右,所有值为真,返回…

麒麟系统安装MySQL

搞了一整天,终于搞定了,记录一下。 一、背景 项目的原因,基于JeecgBoot开发的系统需要国产化支持,这就需要在电脑上安装MySQL等支撑软件。 国产化项目的操作系统多是麒麟系统,我的系统如下: arm64架构。…

C#快速开发OPCUA服务器

为方便演示,此时创建一个控制台应用程序。第三方dll(C编写的库opcsrv.dll,他人实现)。 拷贝dll到运行目录下: 拷贝二次封装后的文件到项目目录下: 第一步:创建OpcUa服务器 //第一步:创建OpcUa服务器 OPCSr…

java.util.Optional类介绍

java.util.Optional 是 Java 8 引入的一个容器类,用于表示可能包含或不包含非空值的对象。它的设计初衷是为了减少程序中的空指针异常(NullPointerException),并使代码更加简洁和易读。 Optional 类的介绍 1. 特点 避免显式的 null 检查:使用 Optional 可以避免显式的 n…

基于ssh框架的个人博客源码

基于ssh的个人博客源码,页面清爽简洁,原先有部分bug,运行不了,现已修复 1.博客首页 (本地访问地址 :localhost:8080/Blog/index/index) 2.关于我 3.慢生活 4.留言板 5.我的相册 微信扫码下载源码

商场配电新思维:智能网关驱动的自动化管理系统

在商场配电室监控系统中,主要是以无线网络为载体,目的就是便于对变电站等实时监测与控制。其中,4G配电网关非常关键,可以将配电室系统终端上的信息数据及时上传到服务器,再由服务器下达控制指令到各模块中,…

Oracle Database 23ai新特性之INTERVAL聚合函数增强

Oracle Database 23ai 开始 AVG 以及 SUM 函数支持 INTERVAL 数据类型,它们可以作为聚合函数或者分析函数使用。 示例表 本文将会使用以下示例表: create table t1 (id integer,start_time timestamp,end_time timestamp,duration in…

超越规模的冒险之旅:引导人工智能价值对齐

在茫茫技术之林中,人工智能凭借大模型占据了重要地位。人们已经不再局限于人机对弈和AI识图,开始探索那些能够模仿人类思考的机器。无论是日常聊天、文本写作,还是[在完美的提示词引导下创作出惊艳的诗歌],我们不得不承认AI工具已…

双指针算法第二弹(查找总价格为目标值的两个商品-和为s的两个数字 三数之和 四数之和)

系列文章目录 《双指针算法第一弹(移动零 复写零 快乐数)》链接:http://t.csdnimg.cn/Nqdvn 目录 系列文章目录 前言 1. 查找总价格为目标值的两个商品 (1)题目及示例 (2)思路&#xff08…

纯css写一个动态圣诞老人

效果预览 在这篇文章中,我们将学习如何使用CSS来创建一个生动的圣诞老人动画。通过CSS的魔力,我们可以让圣诞老人在网页上摇摆,仿佛在向我们招手庆祝圣诞节和新年。 实现思路 实现这个效果的关键在于CSS的keyframes动画规则以及各种CSS属性…

想要打造高效活跃的私域社群,这些技巧要知道

对一些企业来说“做社群等于做私域”。 在腾讯提到的私域转化场景中,社群与小程序、官方导购三者并列。 社群连接着品牌和群内用户。品牌通过圈住更多用户,来持续免费触达用户实现变现,用户则是从品牌方手中直接获取更多服务和优惠。那么&a…