Node实时查询数据库变化,出现 Too many connections 错误

项目背景:一个实时展现来自多个数据库的看板。
由于需要实时,所以我这边目前采用的是setInerval,间隔10s比对一遍数据,如果2个数据不一致,就表示有新增,然后通过websocket通知到前端,进行页面渲染。

刚开始运行是比较正常的,过个几分钟就出错,原因是mysql连接数过多,看了下大概能有200多个sleep的链接。

我使用的是连接池的写法,在代码中已经进行回收,不知道为啥就是回收不回去。开始用的是 connection.release();,发现完全不起作用,换成了destroy,稍有好转,仍有该问题。

修改数据库配置,增大连接数和修改 wait_timeout 都已经尝试过,并不适合。

var mysql = require('mysql');
class mysql_db{
    constructor(site){
        this.site = site
    }
    connect(){
        return mysql.createPool({
            connectionLimit: 10,
            host: BASIC_CONFIG[process.env.NODE_ENV][this.site].conn.host,
            user: BASIC_CONFIG[process.env.NODE_ENV][this.site].conn.user,
            password: BASIC_CONFIG[process.env.NODE_ENV][this.site].conn.password,
            database: BASIC_CONFIG[process.env.NODE_ENV][this.site].conn.database,
            multipleStatements: true  //设置为true可执行多条SQL语句
        });
        
        
    };


   async await_query(sql,values){
       var _this = this;
        return new Promise((resolve, reject) => {
            this.connect().getConnection(function (err, connection) {
                if (err) {
                    reject(err)
                } else {
                    
                    connection.query(sql, values, (err, rows) => {
                       
                        if (err) {
                            console.log(_this.site+ '---错误');
                        
                            reject(err);
                            connection.destroy();

                        } else {
                            console.log(_this.site+ '---正确');
                           
                           
                            resolve(rows);
                            connection.destroy();
                        }
                      
                    })

                    // connection.end(function(err){
                    //     console.log('end a connection');
                    //   });
                }
            })

            
           
        })
       
    }

  
}

module.exports = mysql_db;

以上为项目背景,可能有人会说为啥不在新增数据时进行触发,说明下,因为连接了多个数据库,其他数据库我并只有读取的权利,所以只能采用后端轮询的方式,去监控。(我能想到的就是这个方法)

我的问题是:
1、是否有其他方式进行纯后端检测数据表的变化?
2、msyql模块的回收为啥不起作用?是因为我代码写的有问题吗?
3、我的mysql类,在多个文件中被引入(require),是否是这个原因导致回收不起作用?

谢谢

阅读 2.1k
1 个回答

谢邀。

找到mysql的配置文件,找到一个max_connection项,高处调

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题