我正在使用pg节点模块来连接数据库。我一直在为每个DML操作创建多个连接。当连续查询执行发生时 我收到警告消息"(节点)警告:检测到可能的EventEmitter内存泄漏。添加了11个错误监听器。使用emitter.setMaxListeners()来增加限制。"给定的pg默认值poolSize为5。
var pg = require('pg')
pg.defaults.poolSize = 5;
var dbHelper = {
initializeConnection: function (callback) {
pg.connect(conString, function (err, client, done) {
if (err) {
done(client);
return callback(err, null);
}
callback(null, client, done);
});
pg.on('error', function (err) {
});
pg.end();
},
query: function (pgQuery, args, callback, options) {
this.initializeConnection(function (err, client, done) {
client.query(pgQuery, args, function (err, response) {
done();
return callback(err, response);
});
});
},
};
module.exports = dbHelper;
示例查询
dbHelper.query("SELECT name,age,address FROM EMPLOYEE WHERE id=$1", [1001], function (err, response) {
callback(err, response);
});
如何防止事件发射器内存韭菜。
答案 0 :(得分:0)
原因是您没有正确释放连接:
pg.connect(conString, function (err, client, done) {
if (err) {
done(client);
return callback(err, null);
}
callback(null, client, done);
});
这应该是:
pg.connect(conString, function (err, client, done) {
if (err) {
callback(err, null);
} else {
callback(null, client);
done();
}
});
即。如果没有错误,请致电done()
。
如果你想完全避免这种错误 - 请查看pg-promise;)