2016-04-23 12 views
8

Sto usando node.js & MongoDB e ho il codice asincrono (async.queue) per aggiornare MongoDB.In MongoDB, come assicurarsi che tutte le connessioni vengano chiuse se a volte close() potrebbe non essere richiamato?

Quando tutti i compiti nella coda è finito, chiamo

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

quindi tutte le connessioni utilizzate dai compiti sono chiusi. Tuttavia, in condizioni rare, ho trovato che ci sono connessioni aperte che non vengono mai viste nei log mongoDB. Quindi, dopo poche settimane, ci saranno centinaia di connessioni mai chiuse.

Ho studiato e ho scoperto che forse dovrei impostare questa opzione maxIdleTimeMS, ma questa opzione non è supportata da tutti i driver (il driver node.js non supporta questa opzione).

Anche se sono in grado di ottimizzare il mio codice per verificare che non vi sia alcuna condizione tale da non chiamare close(). Mi sto ancora chiedendo cosa succederebbe se un'app non chiamasse lo db.close() per qualche motivo (o come un'assicurazione extra), esiste un modo per prevenire connessioni sospese in MongoDB?

+0

Stai facendo 'db.close()' sul callback 'drain()'? –

+0

@RahatMahbub yes, sul callback 'drain()', ma il mio codice conta due 'drain()' s, quindi a volte penso che la coordinazione del mio codice non sia perfetta, quindi 'db.close()' non è chiamato. –

+1

Generalmente, le connessioni MongoDB vengono mantenute perché c'è un sovraccarico elevato nello stabilire nuove connessioni. Se si dispone di un pool di connessioni fisso, sarà possibile eseguire async.queue contemporaneamente e mantenerle per sempre non eseguendo un 'db.close()'. Quando si richiama di nuovo la funzione async.queue, solo le connessioni da questo pool verranno riutilizzate e non verranno create nuove connessioni. In questo modo si risparmia un nuovo sovraccarico del tempo di connessione e non si dispone di una connessione inattiva 100 dopo una settimana. –

risposta

2

nodejs mongodb driver drops connection when idle

Handling MongoDB disconnect/reconnects from Node

sembra dopo un certo tempo di inattività, la connessione viene chiusa.

Non è chiaro quale driver viene utilizzato, ma in una delle quel post c'è collegamento a documenti:

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

Imposta KeepAlive a 0, e la vostra connessione verrà terminata ...

+0

Ho provato il tuo suggerimento impostando 0 per keepAlive, ma le connessioni si bloccano ancora se non le chiudo correttamente. –

+0

@JoeHuang È previsto. Prova con il timeout della connessione. Dal punto di vista del server è difficile dire cosa farà il cliente. Uccidere la connessione proprio così - è qualcosa di maleducato - penso. :) –

Problemi correlati