MongoDB: Kein server ausgewählt ReadPreferenceServerSelector
Kürzlich bin ich mit dem mongodb-java-async-Treiber, die neu veröffentlicht. Ich Schreibe einige einfache test-codes, die sind:
MongoClient mongoClient = MongoClients.create();
System.out.println("database has been connected!");
SingleResultCallback<Void> callbackWhenFinished = new SingleResultCallback<Void>() {
@Override
public void onResult(final Void result, final Throwable t) {
System.out.println("Operation Finished!");
}
};
mongoClient.listDatabaseNames().forEach(new Block<String>() {
@Override
public void apply(final String s) {
System.out.println(s);
}
}, callbackWhenFinished);
jedoch die callback-Funktion nicht aufgerufen, die Ausgabe in der Konsole ist:
April 18, 2015 10:50:27 Nachmittag
com.mongodb.Diagnostik.die Protokollierung.JULLogger log-Meldung: Cluster erstellt
mit Einstellungen {hosts=[localhost:27017], Modus=SINGLE,
requiredClusterType=UNBEKANNT, serverSelectionTimeout='30000 ms',
maxWaitQueueSize=500}
Datenbank angeschlossen wurde! April 18, 2015 10:50:28 Nachmittag-com.mongodb.Diagnostik.die Protokollierung.JULLogger log message: Keine
server gewählt
ReadPreferenceServerSelector{readPreference=PV} von cluster
Beschreibung ClusterDescription{type=UNKNOWN, connectionMode=SINGLE,
alle=[ServerDescription{address= " localhost:27017, type=UNKNOWN,
Status=VERBINDEN}]}. Warten für 30000 ms vor Timeout
Damit Sie sehen können, es ist keine callback-Funktion aufgerufen. Weiß jemand, warum?
InformationsquelleAutor ahwyX100 | 2015-04-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die kurze Antwort ist der callback wird aufgerufen schließlich.
Für die lange Antwort, können arbeiten durch den code:
MongoClient
nicht blockieren wartet auf eine Verbindung zu MongoDB im hintergrund die interne connection-pool eine Verbindung herstellen. Aus deinen logs kann ich sehen, haben Sie die Standard -serverSelectionTimeout
von 30000ms.Nächste Schritt, den Sie tun, eine
println
die Ausgabe sofort so "Datenbank verbunden!" gedruckt, unabhängig.Schließlich rufen Sie
listDatabaseNames()
aber was ist nicht klar ist, wenn jeder wartet, bis der callback aufgerufen werden. Wenn Sie fügen Sie einen Riegel, dann warten auf die Antwort-dann werden Sie sehen, dass der callback wird aufgerufen, zB:Nun mit dem Hebel wir
await()
bis der callback aufgerufen wurde, jetzt sollten wir sehen, eine von zwei Dinge passieren:Gibt es keine MongoDB verfügbar.
Es wird schließlich rufen Sie die callback-und zu drucken, dass es ein Fehler war. Es wird warten, bis die
serverSelectionTimeout
mal aus.Gibt es eine MongoDB verfügbar.
Es wird schließlich eine Verbindung herstellen, für jede Datenbank gelten die
Block
und drucken Sie den Namen der Datenbank und dann schließlich es ruft die callback-Signalisierung beendet ist.InformationsquelleAutor Ross
Ich denke, Sie sollte in der Nähe der MongoClient Objekt jedes mal in eine finally-Klausel. Bei mir das gleiche problem aufgetreten, und wenn ich die Verbindung geschlossen, in der Befehlszeile, die ich sah, dass eine MENGE von verbindungen, die geöffnet waren.
Versuchen so etwas (verwende ich mongodb 3.0.7 und mongo-java-Treiber 3.1.0):
Mit dabei, die ich verwenden könnte, meine Verbindung mit kein problem.
InformationsquelleAutor fegyi001