nodejs连接mysql突然中断问题解决方案
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突然中断问题解决方案的更多相关文章
- 转】用Nodejs连接MySQL
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/2/ 感谢! 用Nodejs连接MySQL 从零开始node ...
- nodejs 连接 mysql 查询事务处理
自己用 mysql 很多次的,然后又是主玩nodejs的.专门写一篇文章来说说nodejs连接mysql数据库.在使用之前,请检查计算机是否具有一下环境! nodejs 执行环境. mysql数据库环 ...
- Nodejs连接mysql
1.首先需要安装nodejs 的mysql包 npm install mysql 2.编写nodejs与mysql交互的代码 var mysql = require('mysql'); var TES ...
- nodejs连接mysql并进行简单的增删查改
最近在入门nodejs,正好学习到了如何使用nodejs进行数据库的连接,觉得比较重要,便写一下随笔,简单地记录一下 使用在安装好node之后,我们可以使用npm命令,在项目的根目录,安装nodejs ...
- nodejs连接mysql实例
1.在工程目录下运行npm install mysql安装用于nodejs的mysql模块: 2.创建db.js模块用于连接mysql,同时定义query查询方法: var mysql = requi ...
- 用Nodejs连接MySQL
转载,原地址:http://blog.fens.me/nodejs-mysql-intro/ 前言 MySQL是一款常用的开源数据库产品,通常也是免费数据库的首选.查了一下NPM列表,发现Nodejs ...
- Nodejs连接mysql的增、删、改、查操作
一,创建数据库 Source Database : my_news_test SET FOREIGN_KEY_CHECKS=0; -- ---------------------------- -- ...
- nodejs连接mysql数据库,报错Client does not support authentication protocol requested by server的解决方法
最近想要尝试nodejs连接本地数据库,往全栈方向做一个小小的尝试,于是下载了一个 MySQL8.0,发现Navicat连接不上,结果就下载了mysql自身的Workbench,继续使用. 然而,难受 ...
- 使用nodejs连接mysql数据库实现增删改查
首先要有数据库 使用xampp 或者 phpstudy 可以傻瓜式安装 新建一个项目文件夹 之后在这个目录下初始化package.json (npm init) 先在项目中安装mysql 和 ex ...
随机推荐
- ivms4200 远程桌面访问测试过程及问题汇总
17.11.4 测试存储服务器配置后能否自动录像确认 10:34 4200客户端关闭 10:40 打开4200客户端软件 10:51 关机 10:56 开机,有提示出现,“防火墙阻止... ...
- 处理SpringMVC的时间错误:Field error in object 'sysDatumedetai' on field 'storagetime': rejected value [2017-11-27];
错误: 十一月 27, 2017 8:26:11 下午 org.apache.catalina.core.StandardWrapperValve invoke 严重: Servlet.service ...
- Your Ruby version is 2.2.3, but your Gemfile specified 2.2.2
在文章 Ruby On Rails中REST API使用演示样例--基于云平台+云服务打造自己的在线翻译工具 中,从Bluemix上下载的初始Hello World演示样例代码在本地环境下运行调试时提 ...
- I帧、P帧和B帧的特点
I帧:帧内编码帧 I帧特点: 1.它是一个全帧压缩编码帧.它将全帧图像信息进行JPEG压缩编码及传输; 2.解码时仅用I帧的数据就可重构完整图像; 3.I帧描写叙述了图像背景和运动主体的详情; 4.I ...
- android 动画xml属性具体解释
/** * 作者:crazyandcoder * 联系: * QQ : 275137657 * email: lijiwork@sina.com * 转载请注明出处! */ android 动画属性具 ...
- leetCode 27.Remove Element (删除元素) 解题思路和方法
Remove Element Given an array and a value, remove all instances of that value in place and return th ...
- OpenCASCADE Job - 武汉中南
中南设计集团(武汉)工程技术研究院有限公司是中南工程咨询设计集团有限公司(以下简称“中南设计集团”)打造的工程技术研发和科研创新平台,为中南设计集团旗下全资子公司,于2018年2月成立.公司业务范围涵 ...
- Linux智能手机安全策略研究
Linux智能手机安全策略研究 http://www.zdnet.com.cn 本文是继从“窃听门”事件解读手机Rootkit攻击(http://chenguang.blog.51cto.com ...
- javafx drag
public class EffectTest extends Application { @Override public void start(Stage stage) { stage.setTi ...
- Kinect 开发 —— 骨骼追踪
骨骼追踪技术通过处理景深数据来建立人体各个关节的坐标,骨骼追踪能够确定人体的各个部分,如那部分是手,头部,以及身体.骨骼追踪产生X,Y,Z数据来确定这些骨骼点.骨骼追踪系统采用的景深图像处理技术使用更 ...