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);
                }
            })
        })
    }
}
posted @ 2019-05-22 11:11  芙蓉0504  阅读(2219)  评论(0编辑  收藏  举报