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?
Stai facendo 'db.close()' sul callback 'drain()'? –
@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. –
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. –