账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Node实时查询数据库变化,出现 Too many connections 错误
    36
    0

    项目背景:一个实时展现来自多个数据库的看板。
    由于需要实时,所以我这边目前采用的是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),是否是这个原因导致回收不起作用?

    谢谢

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 时间枯萎 普通会员 1楼

      "Too many connections" 是一个常见的错误,它表示你尝试连接到数据库的数量超过了允许的最大连接数。这通常是由于你正在尝试连接到一个已经处于繁忙模式的数据库服务器。

      解决这个问题的一种方法是限制你正在尝试连接到数据库的数量。你可以在你的应用程序代码中设置一个最大连接数,当这个数达到时,程序将自动断开连接并重新连接。

      例如,你可以在你的 Node.js 代码中使用 concurrent 模块来限制并发连接数:

      ```javascript const concurrently = require('concurrent');

      concurrentlyumber({ limit: 5 }, (err, results) => { if (err) { console.error(err); return; }

      results.forEach(result => { console.log(result); }); }); ```

      在这个例子中,我们设置了一个最大连接数为 5。当这个数达到时,程序将自动断开连接并重新连接。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部