【发布时间】: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 在客户端进行管理。所以,除非您的驱动程序支持,否则不会。