【问题标题】:In MongoDB, how to make sure all connection will be closed if close() might not get called sometimes?在 MongoDB 中,如果 close() 有时可能不会被调用,如何确保所有连接都将关闭?
【发布时间】:2016-08-17 02:13:33
【问题描述】:

我正在使用 node.js 和 MongoDB,并且我有异步代码 (async.queue) 来更新 MongoDB。

当队列中的所有任务都完成后,我调用

db.close()   // db is a Mongo client instance

因此任务使用的所有连接都被关闭。但是,在极少数情况下,我发现在 mongoDB 日志中存在从未关闭的打开连接。所以几周后,将有数百个连接永远不会关闭。

我研究发现,也许我应该设置这个选项maxIdleTimeMS,但是并不是所有驱动都支持这个选项(node.js驱动不支持这个选项)。

即使我可以微调我的代码以确保不存在不调用 close() 的情况。我仍然想知道如果应用程序由于某种原因(或作为额外保险)没有调用 db.close() 怎么办,有什么方法可以防止 MongoDB 中的连接挂起?

【问题讨论】:

  • 你在 drain() 回调上做 db.close() 吗?
  • @RahatMahbub 是的,在drain() 回调上,但是我的代码依赖两个drain()s,所以有时我猜我的代码的协调没有完美完成,所以db.close() 没有被调用.
  • 一般情况下,MongoDB 连接会被保留,因为建立新连接的开销很大。如果您有一个固定的连接池,您将能够同时执行您的 async.queue 并通过不执行 db.close() 来永久保留它们。当您再次调用 async.queue 函数时,只会重用这些池中的连接,并且不会创建新连接。这样可以节省新的连接时间开销,并且一周后不会有 100 个空闲连接。
  • @RahatMahbub 明白,我的问题是......作为额外的保险,有没有办法确保即使应用程序忘记调用db.close(),连接也会关闭?
  • maxIdleTimeMS 在客户端进行管理。所以,除非您的驱动程序支持,否则不会。

标签: node.js mongodb


【解决方案1】:

nodejs mongodb driver drops connection when idle

Handling MongoDB disconnect/reconnects from Node

看起来在空闲一段时间后,连接已关闭。

目前尚不清楚使用的是哪个驱动程序,但在其中一篇文章中有文档链接:

http://mongodb.github.io/node-mongodb-native/api-generated/server.html#server

将keepAlive设置为0,你的连接将被终止……

【讨论】:

  • 我尝试了您的建议,将 keepAlive 设置为 0,但如果我没有正确关闭它们,连接仍然会挂起。
  • @JoeHuang 这是意料之中的。尝试连接超时。从服务器的角度来看,很难判断客户端将要做什么。像那样杀死联系-我认为是粗鲁的。 :)
猜你喜欢
  • 2016-02-09
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 2018-02-21
  • 1970-01-01
相关资源
最近更新 更多