我们正在使用mongoose连接到MongoDB。最初创建了一个包含100个连接的池,并使用mongoose方法连接到其他数据库 useDb
以下是代码段
var url = require("url");
var connectRoute = require('connect-route');
var connect = require('connect'),
app = connect.createServer();
var mongoose = require('mongoose');
var conn = mongoose.createConnection('mongodb://localhost:10040/first', {server: {poolSize: 100}});
conn.on('error', console.error.bind(console, 'connection error:'));
var Schema = mongoose.Schema;
var MySchema = new Schema({
user: String,
pwd: String, roles: []
},
{strict: false}
);
app.use(connectRoute(function (router){
router.get('/get', function(req,res){
var db2 = conn.useDb('second_DB');
var data = db2.model('', MySchema, 'coll');
data.update({name: "Janu"}, {$set: {"name": "test"}}, {upsert: true} , function (err, data,log) {
//console.log(a.data.data );
res.end(JSON.stringify(log.connectionId));
});
});
}));
app.listen(3000);
console.log('info','Connect server listening on port 3000 ' );
即使Poolsize设置为100,当给出超过10个并发请求时,将警告抛出为
(节点)警告:检测到可能的EventEmitter内存泄漏。 11名听众补充道。使用emitter.setMaxListeners()来增加限制。
MongoDB版本 - 2.6.4 猫鼬版 - 3.8.12
任何人都可以帮忙解决为什么会发出警告吗?
答案 0 :(得分:2)
函数conn.useDb
创建一个新的连接对象并在其上添加一个事件监听器。 Poolsize的大小不会影响它。
您的代码有效地具有EventEmitter内存泄漏。每次调用路由时,都会创建一个带有事件侦听器的新对象,并且永远不会删除它。
解决问题:缓存conn.useDb的返回值。
如果您有超过10个数据库,则可以使用以下命令增加应用程序启动时的侦听器限制:
require('events').EventEmitter.defaultMaxListeners = 15;
或
emitter.setMaxListeners()
答案 1 :(得分:1)
当 useDb('name', {noListener:true} ); 时使用这个选项;
答案 2 :(得分:0)
您可能希望设置 the useCache
option 以便每个 useDb
调用不会创建新的连接对象。
答案 3 :(得分:0)
在使用 useDb()
时使用以下 dbOptions
const useDbOptions = {
//ensures connections to the same databases are cached
useCache: true,
//remove event listeners from the main connection
noListener: true
}
conn.useDb('another_DB', useDbOptions);
还要确保在每次请求后手动删除每个连接中的所有用户模型,使用:
conn.deleteModel(/.*/) // Delete all models on conn
这可确保释放多余的内存,因为否则每个连接都会维护与特定连接关联的所有模型的内部列表。
请参阅:https://github.com/Automattic/mongoose/issues/9961 了解详细信息。