首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >猫鼬-useDb(名称)不允许超过10个并发请求

猫鼬-useDb(名称)不允许超过10个并发请求
EN

Stack Overflow用户
提问于 2014-08-14 05:18:44
回答 4查看 7.2K关注 0票数 4

我们使用猫鼬连接到MongoDB.Initially,创建了由100个连接组成的池,并使用mongoose方法useDb连接到其他数据库。

下面是代码片段

代码语言:javascript
复制
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

有人能帮我弄清楚为什么这个警告会出现吗?

EN

回答 4

Stack Overflow用户

发布于 2017-05-23 19:20:35

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

您的代码实际上有一个EventEmitter内存泄漏。每次调用路由时,都会创建一个带有事件侦听器的新对象,并且永远不会被删除。

要修复您的问题:缓存conn.useDb的返回值。

如果有10个以上的数据库,则可以在应用程序开始时增加侦听器的限制,如下所示:

代码语言:javascript
复制
require('events').EventEmitter.defaultMaxListeners = 15;

或使用

代码语言:javascript
复制
emitter.setMaxListeners()
票数 7
EN

Stack Overflow用户

发布于 2021-05-21 08:44:06

您可能希望设置 option,以便每个useDb调用都不会创建新的连接对象。

票数 3
EN

Stack Overflow用户

发布于 2021-06-17 09:31:40

在使用dbOptions时使用以下useDb()

代码语言:javascript
复制
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);

还请确保在每次请求之后,手动删除每个连接中的所有用户模型,使用:

代码语言:javascript
复制
 conn.deleteModel(/.*/) // Delete all models on conn

这将确保释放多余的内存,因为否则每个连接都会维护与特定连接关联的所有模型的内部列表。

有关详细信息,请参阅:https://github.com/Automattic/mongoose/issues/9961

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25300584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档