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.pswp.cn/diannao/36478.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/36478.shtml
英文地址,請注明出處:http://en.pswp.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…