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. mybatis+springmvc+sqlite一个累心的问题:不在纠结

    1 java.sql.SQLException: NYI 2 org.sqlite.RS.getColumnClassName(RS.java:269) 在配置mybatis+springmvc+sq ...

  2. 安装SQL2008后需要打开的端口为 1433,4630

  3. javaScript学习之正则表达式初探

    正则表达式    正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念.正则表达式通常被用来检索.替换那些符 ...

  4. 昼猫笔记 JavaScript -- 作用域技巧!!

    简单理解 var zm = function (x) { var code = 'bb' return code }; 学过js的老哥们都知道,当这样简单的一个函数进入浏览器,浏览器开始解释代码,会将 ...

  5. QNX与Linux两家未来有望独霸车载电子操作系统

    车载电子操作系统是汽车智能化的核心,能够有效分配车机的硬件资源,对车内各种任务功能进行协同管理,并控制各项任务优先级别.常见的车载电子操作系统有:QNX.Linux(Android,AaliOS).W ...

  6. 超好用的谷歌浏览器、Sublime Text、Phpstorm、油猴插件合集

    原文:超好用的谷歌浏览器.Sublime Text.Phpstorm.油猴插件合集 - 『精品软件区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|破解软件|www.52pojie.c ...

  7. Redis 数据持久化的方案的实现

    原文:Redis 数据持久化的方案的实现 版权声明:m_nanle_xiaobudiu https://blog.csdn.net/m_nanle_xiaobudiu/article/details/ ...

  8. Objective-C method及相关方法分析

    ## Objective-C method及相关方法分析 转载请注名出处 [http://blog.csdn.net/uxyheaven](http://blog.csdn.net/uxyheaven ...

  9. [Android实例] 高速静默更新,低流量耗费,让APP活跃起来!

    大家好.我是csdn的新人,给大家带来一个做了一个星期的SDK,能够实现将Android APP碎片化管理.自由更新,实时更新,低流量耗费的更新~~ Zag Whim Renewal A system ...

  10. ElasticSearch、Kibana Web管理

    ElasticSearch的Web管理 http://localhost:9200/ http://localhost:9200/cluster/health?pretty http://localh ...