mongodb连接超时错误

Arm*_*yan 13 javascript mongodb nosql node.js

我使用mongodb数据库和node.js v12.0.10来连接和更新mongodb集合.连接代码如下:

 async.parallel({
        RE5: function (cb) {
            MongoClient.connect(config.riskEngineDB, function (err, r5DB) {
                cb(err, r5DB);
            })
        },
        MDB: function (cb) {
            MongoClient.connect(config.monitoringDB, function (err, mDB) {
                cb(err, mDB);
            })
        }
    },
    function (err, DBs) {
        assert.equal(null, err);
        console.log("Connected correctly to Dbs");
        // ..doing updates..

 })
Run Code Online (Sandbox Code Playgroud)

运行一段时间后,脚本打印出以下错误:

  { [MongoError: connection 39 to 127.0.0.1:27017 timed out]
  name: 'MongoError',
  message: 'connection 39 to 127.0.0.1:27017 timed out' }
Run Code Online (Sandbox Code Playgroud)

为了您的信息,我使用了mongodb的不同连接选项,但它没有意义.

Chr*_*hew 16

我想提供这个答案,因为它出现在免费在线 mongodb 大学的 mongodb 考试问题中。它是彻底的,并提供了文档。

我已经想通了,并将清理一些主要是由于课程中缺乏解释而引起的混乱。我不是挑剔的,但需要进一步解释才能正确回答这个问题。

首先,当通过应用程序连接到 mongodb 时,您将使用驱动程序。该驱动程序必须通过障碍才能对 mongodb 服务器执行任何操作。当你理解了这个障碍的概念时,你就会理解这个问题。

为了通过障碍并最终进行写入或读取操作,最终形成一系列事物的每个连接都必须发生。

视觉上你可以这样想:

IO/写请求发生 ==> || 第一个障碍 --> (服务器选择 - (err -> ) ) ==> || 第二个障碍 --> 连接到服务器 - (err -> 'connectionTimeoutMS' ) ==> || 第三个障碍 --> 套接字连接 - (err -> 'socketTimeoutMS' ) ==****Write Concern Options Barriers**==> || 第四个障碍 --> '写关注规范 { w: <value>, j: <boolean>, wtimeout: <number> }' ==> || 第 5 个障碍 --> 成功的写/读操作 serverSelectionTimeoutMS

*****注意**:根据您的逻辑,此管道的任何地方都会发生故障,可能不会发生成功的写入/读取操作。

我们可以将障碍 1 - 3 视为连接的网络障碍。如果网络出现故障或出现问题,这些是人们会通过超时和这些超时的异常处理注意到的问题。人们必须理解的是,如果您一开始无法连接到服务器,则无法执行带有写入问题的写入操作。本课本可以说明这些要点。

写入或读取操作的第一组障碍是建立与服务器的连接……这在上面的障碍 1 - 3 中进行了说明。

然后,在通过集群和/或集群副本集建立服务器连接后,您可以定义写关注点。

在我们建立连接后,可能不会因为网络连接以外的原因而发生写入。这些可能是由于 DDOS 或黑客攻击导致的数据冲突或写入的极端分配,或者通常没有足够的服务器空间来将数据写入服务器。重点是,其他事情可能会导致对写关注的反应,因此通过选项进行控制来处理写关注错误。

我希望这会有所帮助,因为它使我相应地理解了问题和正确答案。大多数情况下,我们并没有真正教过这个,所以我希望这有助于其他人学习和理解这个反馈循环。

以下是我阅读的一些文章,以帮助我得出这个答案/结论。如果有人对我的解释有更好或改进的地方,请随时提供反馈。

https://scalegrid.io/blog/understanding-mongodb-client-timeout-options/

https://scalegrid.io/blog/mongodb-write-concern-3-must-know-caveats/

https://docs.mongodb.com/manual/reference/write-concern/

https://www.mongodb.com/blog/post/server-selection-next-generation-mongodb-drivers


Cha*_*oza 8

我有类似的经历,因为查询花了太多时间来回复

在节点mongo驱动程序中有2个可配置的超时:

connectTimeoutMS并且socketTimeoutMS,默认为30秒(http://mongodb.github.io/node-mongodb-native/2.2/reference/connecting/connection-settings/)

如果您的查询需要超过30秒才能发送其第一个结果,那么它将以连接超时错误结束.

如果你的查询在两个结果之间花费超过30秒,那么由于池缩小,它可能会以该连接关闭结束.

您可能希望增加超时,或确保查询足够快(例如创建索引).我建议加快查询,因为增加超时可能会有性能下降.

  • 是否有可能获得一些有关哪些查询花费太长时间的信息?在我的日志中,我只看到连接超时的错误,但我找不到它是哪一个。谢谢你! (2认同)