2014-07-22 6 views
5

nodejs mongodb-Treiber löscht die Verbindung im Leerlauf und verbindet sich nicht erneut.nodejs mongodb-Treiber löscht die Verbindung im Leerlauf

Hintergrund

Das Skript unten an MongoDB verbindet und speichert eine Referenz auf die Datenbank in einer globalen Variablen „db“

config = require("./config.js"); 
express = require("express"); 
mongodb = require("mongodb"); 

db = null; 

options = { 
    auto_reconnect: true, 
    db: { 
    w: 1 
    } 
}; 

mongodb.MongoClient.connect(config.mongo, options, function(err, database) { 

    if (err !== null) 
    return console.log(err); 

    db = database; 
    console.log("successfully connected to mongodb"); 

    db.on("close", (function() { 
    return console.log("Connection to database closed automagically " + arguments); 
    })); 

    db.on("error", function(err) { 
    return console.log("Db error " + err); 
    }); 

    app.listen(port); 

    return console.log("listening for connections on " + port); 

}); 

Jedes Mal, wenn ich einen Einsatz Anfrage von Client erhalten die folgende Funktion ist aufgerufen:

insert = function(collectionName, object) { 
    return db.collection(collectionName).insert(object, {w: 1}, (function(err) { 
    return console.log("insert complete with err = " + err); 
    })); 
}; 

Ausgabe

Wenn der Server einen Einsatz Anforderung nach einer langen Zeit empfängt er leise oder manchmal versagt wirft einen Fehler, der besagt unable to insert object (Error: failed to connect to [host:port])

Frage

Gibt es eine Möglichkeit, dieses Verhalten zu verhindern? Ich habe versucht, Auto_reconnect-Option zu verwenden und Anliegen von 1 zu schreiben, aber keiner von diesen hat geholfen.

Danke!

+1

[Verbindungspools] (http://stackoverflow.com/questions/10656574/how-to-manage-mongodb-connections-in-a-nodejs -webapp/14464750 # 14464750) kann Ihnen helfen, die Redundanz aufrechtzuerhalten, zumindest wenn Sie erwarten, dass einige Verbindungen fehlschlagen. Wenn Sie dann regelmäßig den Pool mit sinnlosen "Pings" überprüfen, können Sie bestätigen, dass die Verbindungen abfallen, und dann einige neue hinzufügen. Ich bin mir nicht sicher, ob sie alle ungefähr zur gleichen Zeit oder in einer gestaffelten Art und Weise fallen würden, aber es wäre vielleicht einen Versuch wert. – TheEnvironmentalist

Antwort

4

Gelöst!

  1. Set server.socketoptions.keepAlive to 1. aktualisieren Sie einfach die Optionen Objekt wie folgt:

    options = { 
        auto_reconnect: true, 
        db: { 
        w: 1 
        }, 
        server: { 
        socketOptions: { 
         keepAlive: 1 
        } 
        } 
    }; 
    
  2. Ping die Datenbank in regelmäßigen Abständen. Hier ist ein Code-Snippet, das genau das tut:

    printEventCount = function() { 
        db.collection("IOSEvents").count(function(err, numberOfEvents) { 
        console.log(new Date() + ": error = " + err + ", number of events = " + numberOfEvents); 
        ping(); 
        }); 
    }; 
    
    ping = function() { 
        if (config.pingPeriod === 0) 
        return;  
        setTimeout(printEventCount, config.pingPeriod); 
    }; 
    
+0

Ab Treiber 2.1 müssen Sie auto_reconnect: true nicht explizit festlegen. http://mongodb.github.io/node-mongodb-native/2.1/api/Server.html –

+1

socketOptions.keepAlive ist eine Zahl (ms), kein Boolean. Es ist wahrscheinlich keine gute Idee, es auf 1 zu setzen. mongolabs empfiehlt eine Einstellung von 30 Sekunden (30000): https://gist.github.com/mongolab-org/9959376 –

Verwandte Themen