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()