我们使用猫鼬连接到MongoDB.Initially,创建了由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
有人能帮我弄清楚为什么这个警告会出现吗?
发布于 2017-05-23 19:20:35
函数conn.useDb创建一个新的连接对象并在其上添加一个事件侦听器。Poolsize的大小不影响这一点。
您的代码实际上有一个EventEmitter内存泄漏。每次调用路由时,都会创建一个带有事件侦听器的新对象,并且永远不会被删除。
要修复您的问题:缓存conn.useDb的返回值。
如果有10个以上的数据库,则可以在应用程序开始时增加侦听器的限制,如下所示:
require('events').EventEmitter.defaultMaxListeners = 15;或使用
emitter.setMaxListeners()发布于 2021-05-21 08:44:06
您可能希望设置 option,以便每个useDb调用都不会创建新的连接对象。
发布于 2021-06-17 09:31:40
在使用dbOptions时使用以下useDb()
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。
https://stackoverflow.com/questions/25300584
复制相似问题