Mongoose – useDb(名称)不允许超过10个并发请求

我们使用mongoose来连接到MongoDB。最初创build了一个由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 Mongoose版本 – 3.8.12

任何人都可以帮忙,为什么这个警告越来越?

函数conn.useDb创build一个新的连接对象并在其上添加一个事件监听器。 Poolsize的大小不会影响到这一点。

您的代码有效地发生EventEmitter memoryleak。 每次调用路由时,都会创build一个具有事件侦听器的新对象,并且永远不会被删除。

要解决您的问题:cachingconn.useDb的返回值。

如果您的数据库超过10个,则可以在应用程序启动时增加监听程序的限制:

 require('events').EventEmitter.defaultMaxListeners = 15; 

或与

 emitter.setMaxListeners()