db/index.js数据库配置文件

一、在数据库连接失败的情况下,回调函数,再次发起连接,直到连接成功为止。

handleDisconnect(){
this.connection.connect(function(err) {
if(err) {
// console.log('error when connecting to db:', err);
setTimeout(_this.handleDisconnect, 2000);
}
});
this.connection.on('error', function(err) {
if(err.code === 'PROTOCOL_CONNECTION_LOST') {
_this.handleDisconnect();
} else {
throw err;
}
});
}

二、mysql在8个小时内没有任何操作,就会自动中断连接

因此,每个三个小时每个小时ping一次数据库,保持数据库连接状态

clearInterval(pingInterval);
pingInterval = setInterval(() => {
_this.connection.ping((err) => {
if (err) {
console.log('ping error: ' + JSON.stringify(err));
}
});
}, 3600000*3);

三、完整代码如下:

// 加载数据库模块
var mysql = require('mysql');
var _this;
var pingInterval = null;
var db_config = {
host: "host", //主机地址
user: "user", //数据库用户名
password: "password", //数据库用户密码
database: "database" //数据库名
}
class DB{
constructor(){
_this = this;
this.connection = null;
}
handleDisconnect(){
this.connection = mysql.createConnection(db_config);
//数据库连接
this.connection.connect(function(err) {
if(err) {
// console.log('error when connecting to db:', err);
setTimeout(_this.handleDisconnect, 2000);
}
});
this.connection.on('error', function(err) {
if(err.code === 'PROTOCOL_CONNECTION_LOST') {
_this.handleDisconnect();
} else {
throw err;
}
});
// 每个小时ping一次数据库,保持数据库连接状态
clearInterval(pingInterval);
pingInterval = setInterval(() => {
_this.connection.ping((err) => {
if (err) {
console.log('ping error: ' + JSON.stringify(err));
}
});
}, 3600000*3);
return this.connection;
}
} module.exports = DB;
使用数据库的文件controller/query.js

在开启事务的时候判断数据库连接是否连接错误,

如果连接错误,再次发起连接。

db.beginTransaction((err)=>{
if(err!==null){
db = _this.handleDisconnect();
db.beginTransaction((err)=>{
callback(err)
})
}else{
callback(err)
}
})

完整代码如下:

const DB = require("../../db/index");
const Async = require("async");
var db;
class Query extends DB{
constructor(){
super()
db = this.handleDisconnect()
}
async getList(limit,page,cate,keywords,grade){
return new Promise((resolve, reject) => {
var mydatas = {data:[],total:0}; // ....此处省略业务代码 // 用Async代替嵌套
var task = [
(callback)=>{
// 开启事务
db.beginTransaction((err)=>{
if(err!==null){
db = _this.handleDisconnect();
db.beginTransaction((err)=>{
callback(err)
})
}else{
callback(err)
}
})
},
(callback)=>{
const sql = `...`;
db.query(sql,(err,res)=>{
callback(err);
})
},
(callback)=>{
// 提交事务
db.commit((err)=>callback(err));
}
];
Async.waterfall(task,(err,res)=>{
if(err){
// 事务回滚
db.rollback();
}else{
resolve(mydatas);
}
})
})
}
}

nodejs连接mysql突然中断问题解决方案的更多相关文章

  1. 转】用Nodejs连接MySQL

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! 用Nodejs连接MySQL 从零开始node ...

  2. nodejs 连接 mysql 查询事务处理

    自己用 mysql 很多次的,然后又是主玩nodejs的.专门写一篇文章来说说nodejs连接mysql数据库.在使用之前,请检查计算机是否具有一下环境! nodejs 执行环境. mysql数据库环 ...

  3. Nodejs连接mysql

    1.首先需要安装nodejs 的mysql包 npm install mysql 2.编写nodejs与mysql交互的代码 var mysql = require('mysql'); var TES ...

  4. nodejs连接mysql并进行简单的增删查改

    最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs ...

  5. nodejs连接mysql实例

    1.在工程目录下运行npm install mysql安装用于nodejs的mysql模块: 2.创建db.js模块用于连接mysql,同时定义query查询方法: var mysql = requi ...

  6. 用Nodejs连接MySQL

    转载,原地址:http://blog.fens.me/nodejs-mysql-intro/ 前言 MySQL是一款常用的开源数据库产品,通常也是免费数据库的首选.查了一下NPM列表,发现Nodejs ...

  7. Nodejs连接mysql的增、删、改、查操作

    一,创建数据库 Source Database : my_news_test SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- ...

  8. nodejs连接mysql数据库,报错Client does not support authentication protocol requested by server的解决方法

    最近想要尝试nodejs连接本地数据库,往全栈方向做一个小小的尝试,于是下载了一个 MySQL8.0,发现Navicat连接不上,结果就下载了mysql自身的Workbench,继续使用. 然而,难受 ...

  9. 使用nodejs连接mysql数据库实现增删改查

      首先要有数据库 使用xampp 或者 phpstudy 可以傻瓜式安装 新建一个项目文件夹 之后在这个目录下初始化package.json (npm init) 先在项目中安装mysql 和 ex ...

随机推荐

  1. sql中的 SET QUOTED_IDENTIFIER OFF、SET ANSI_NULLS ON

    代码 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-- ...

  2. Vue或React多页应用脚手架

    https://github.com/zhujiasheng/vue-multipage https://github.com/MeCKodo/vue-multipage

  3. C++包含头文件时尖括号和双引号区别

    原文链接:http://c.biancheng.net/cpp/biancheng/view/66.html 如果你还看一些别的C++教程,那么你可能很早就发现了,有些书上的#include命令写作# ...

  4. 编写jsp代码时出现的红色提示线错误

    将jsp页面关闭:点击"X"号,例如图中的index.jsp页面的”X"号,或者右键—“close"也可以.   双击jsp页面:重新启动页面,页面的错误提示线 ...

  5. 用efibootmgr管理UEFI启动项,添加丢失的启动项

    UEFI用来替代传统BIOS引导操作系统,学会修改UEFI启动项也变得十分重要,UEFI全称为:“统一的可扩展固件接口”(Unified Extensible Firmware Interface), ...

  6. UVA 12649 Folding Machine 搜索

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

  7. web安全:防范点击劫持的两种方式

    防范点击劫持的两种方式 什么点击劫持?最常见的是恶意网站使用 <iframe> 标签把我方的一些含有重要信息类如交易的网页嵌入进去,然后把 iframe 设置透明,用定位的手段的把一些引诱 ...

  8. azure云中 mount: wrong fs type, bad option, bad superblock on /dev/sdc1

    2016-01-30 mount失败问题解决 [root@mofficedb2 ~]# mount /dev/sdc /dta mount: you must specify the filesyst ...

  9. 构建基于Javascript的移动CMS——加入滑动

    在和几个有兴趣做移动CMS的小伙伴讨论了一番之后,我们认为当前比較重要的便是统一一下RESTful API.然而近期持续断网中,又遭遇了一次停电,暂停了对API的思考.在周末无聊的时光了看了<人 ...

  10. amaze ui各个模块简单说明

    amaze ui各个模块简单说明 导航添加依据 http://amazeui.org/css/  下面内容属学习笔记,如有理解偏差和错误请留言相告,感谢!* =(官网这块写的很详细) 一.基本样式 1 ...