Mongoose - useDb(name)不允许超过10个并发请求

时间:2014-08-14 05:18:45

标签: node.js mongodb

我们正在使用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

任何人都可以帮忙解决为什么会发出警告吗?

4 个答案:

答案 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 了解详细信息。