我正在使用node.js & MongoDB,我有異步代碼(async.queue
)來更新MongoDB。在MongoDB中,如果close()有時不會被調用,如何確保所有連接都會被關閉?
當隊列中的所有任務完成後,我請
db.close() // db is a Mongo client instance
因此由任務使用的所有連接都是關閉的。但是,在極少情況下,我發現在mongoDB日誌中存在從未關閉的開放連接。所以幾周後,將會有數百個連接從未關閉。
我研究發現,也許我應該設置這個選項maxIdleTimeMS
,但是這個選項不被所有的驅動程序支持(node.js驅動程序不支持這個選項)。
即使我可以微調我的代碼,以確保不存在close()
未被調用的條件。我仍然想知道如果某個應用因爲某種原因(或作爲額外保險)未撥打db.close()
,有什麼方法可以防止在MongoDB中掛起連接?
你在'drain()'回調函數上做'db.close()'嗎? –
@RahatMahbub是的,在'drain()'回調中,但是我的代碼依賴於兩個'drain()',所以有時我猜測我的代碼的協調並不完美,所以'db.close()'不是調用。 –
一般來說,MongoDB連接會保留,因爲建立新連接的開銷很大。如果你有一個固定的連接池,你可以同時執行你的async.queue,只需要不做'db.close()'就可以永遠保留它們。當您再次調用async.queue函數時,只有來自這些池的連接將被重用,並且不會創建新的連接。這樣可以節省新的連接時間開銷,並且一週後不會有100個空閒連接。 –