2016-04-23 31 views
8

我正在使用node.js & MongoDB,我有異步代碼(async.queue)來更新MongoDB。在MongoDB中,如果close()有時不會被調用,如何確保所有連接都會被關閉?

當隊列中的所有任務完成後,我請

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

因此由任務使用的所有連接都是關閉的。但是,在極少情況下,我發現在mongoDB日誌中存在從未關閉的開放連接。所以幾周後,將會有數百個連接從未關閉。

我研究發現,也許我應該設置這個選項maxIdleTimeMS,但是這個選項不被所有的驅動程序支持(node.js驅動程序不支持這個選項)。

即使我可以微調我的代碼,以確保不存在close()未被調用的條件。我仍然想知道如果某個應用因爲某種原因(或作爲額外保險)未撥打db.close(),有什麼方法可以防止在MongoDB中掛起連接?

+0

你在'drain()'回調函數上做'db.close()'嗎? –

+0

@RahatMahbub是的,在'drain()'回調中,但是我的代碼依賴於兩個'drain()',所以有時我猜測我的代碼的協調並不完美,所以'db.close()'不是調用。 –

+1

一般來說,MongoDB連接會保留,因爲建立新連接的開銷很大。如果你有一個固定的連接池,你可以同時執行你的async.queue,只需要不做'db.close()'就可以永遠保留它們。當您再次調用async.queue函數時,只有來自這些池的連接將被重用,並且不會創建新的連接。這樣可以節省新的連接時間開銷,並且一週後不會有100個空閒連接。 –

回答

2

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,你的連接將被終止...

+0

我試圖通過設置0 keepAlive來建議您,但如果我沒有正確關閉它們,連接仍會掛起。 –

+0

@JoeHuang這是預期的。嘗試連接超時。從服務器的角度來看,很難說客戶端要做什麼。像這樣殺死連接 - 是不禮貌的 - 我想。 :) –

相關問題