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);
                }
            })
        })
    }
}

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Node.js中连接MySQL数据库可以使用一些库,比如mysql`、`mysql2`、`sequelize`。以下是使用`mysql2`库的示代码: 首先,确保已经安装了`mysql2`库。可以使用以下命令进行安: ```shell npm mysql2 ``` 然后,在你的代码文件中引入`mysql2`库和创建数据库连接的配置信息,如下所示: ```javascript const mysql = require('mysql2'); // 创建数据库连接配置 const connection = mysql.createConnection({ host: 'localhost', // 数据库主机名 user: 'your_username', // 数据库用户名 password: 'your_password', // 数据库密码 database: 'your_database' // 数据库名称 }); // 连接到数据库 connection.connect(function(err) { if (err) { console.error('Error connecting to MySQL database: ' + err.stack); return; } console.log('Connected to MySQL database as id ' + connection.threadId); }); // 执行SQL查询 connection.query('SELECT * FROM your_table', function(err, results, fields) { if (err) { console.error('Error executing query: ' + err.stack); return; } // 处理查询结果 console.log(results); }); // 关闭数据库连接 connection.end(); ``` 在上面的示例中,将`your_username`、`your_password`和`your_database`替换为你的MySQL数据库的实际信息。然后,你可以根据需要执行SQL查询并处理结果。 请注意,在实际开发中,你可能使用连接池来管理数据库连接,以提高性能和可伸缩性。以上只是一个简单的示例,你可以根据自己的需求进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值