【问题标题】:Is it a good idea to have multiple Mongo connections open from a single Node.js app?从单个 Node.js 应用程序打开多个 Mongo 连接是个好主意吗?
【发布时间】:2012-09-29 02:37:53
【问题描述】:

背景:我正在尝试优化我的 Node.js API 的速度,该 API 在 Amazon Cloud 上使用 Express 和 Mongoose 构建。我有一个 API 调用需要很长时间才能运行(我的 /stats API 调用会编译来自大量来源的数据,因此会进行数百个 mongo 查询,因此运行大约需要 20 秒)。我注意到,当这个 API 调用正在运行时,其他也命中 Mongo 副本集的 API 调用返回缓慢。我的第一个想法是统计查询很慢,因此阻塞,但根据我的统计面板,我没有任何查询需要超过 100 毫秒才能运行,而且我的 Mongo DB 统计数据都在相当健康的范围内(每个查询 20 多个)第二,

问题:现在,我的 Node.js 应用程序在启动时与 Mongo 集建立了单一连接,并且所有查询都使用该连接。建立多个连接会更好吗?例如,我应该为每个入站 API 请求建立一个新的 Mongo 连接吗?或者,也许我应该有一个与副本集的静态连接数,并在执行查询时在这些连接之间进行负载平衡?

或者我完全不在基地?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    您绝对应该使用多个连接,否则一次只能执行一个查询。最简洁的方法是在创建Db 对象时在mongodb.Server 对象上启用连接池。例如:

    var serverOptions = {
        'auto_reconnect': true,
        'poolSize': 5
    };
    
    var mdb = new mongodb.Db('test', new mongodb.Server('127.0.0.1', 27017, serverOptions));
    mdb.open(function (err, mdb) { ... }
    

    您没有在统计数据中看到缓慢的查询时间的原因是您的并发查询只是在客户端排队等待连接可用。该等待时间不会显示在服务器端查询时间中。

    【讨论】:

    • 现在默认为poolSize: 5。供参考。但是我认为,您仍然必须使用 mongoose 明确指定它。在我的答案底部的“更新”中查看示例:stackoverflow.com/questions/10039163/…
    • 这太神奇了,我不知道我怎么错过了连接池的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-17
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多