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