Ich verwende den Node-Mongodb-nativen Treiber mit MongoDB, um eine Website zu schreiben.
Ich habe einige Fragen zum Verwalten von Verbindungen:
Reicht es aus, nur eine MongoDB-Verbindung für alle Anfragen zu verwenden? Gibt es Leistungsprobleme? Wenn nicht, kann ich eine globale Verbindung für die gesamte Anwendung einrichten?
Wenn nicht, ist es gut, wenn ich bei Eingang der Anfrage eine neue Verbindung öffne und sie bei Bearbeitung der Anfrage schließe? Ist es teuer, eine Verbindung zu öffnen und zu schließen?
Soll ich einen globalen Verbindungspool verwenden? Ich habe gehört, der Treiber hat einen nativen Verbindungspool. Ist es eine gute Wahl?
Wenn ich einen Verbindungspool verwende, wie viele Verbindungen sollten verwendet werden?
Gibt es andere Dinge, die ich beachten sollte?
Antworten:
Der primäre Committer für Node-Mongodb-Native sagt :
Um Ihre Frage direkt zu beantworten, verwenden Sie das daraus resultierende Datenbankobjekt erneut
MongoClient.connect()
. Dies gibt Ihnen ein Pooling und eine spürbare Geschwindigkeitssteigerung im Vergleich zum Öffnen / Schließen von Verbindungen bei jeder Datenbankaktion.quelle
req.db
mit dieser Middleware speichern : github.com/floatdrop/express-mongo-dbÖffnen Sie beim Starten der Anwendung Node.js eine neue Verbindung und verwenden Sie das vorhandene
db
Verbindungsobjekt erneut:/server.js
/api/users.js
Quelle: So öffnen Sie Datenbankverbindungen in einer Node.js / Express-App
quelle
Hier ist ein Code, der Ihre MongoDB-Verbindungen verwaltet.
Wenn Sie den Server starten, rufen Sie an
initPool
In jedem anderen Modul können Sie dann Folgendes tun:
Dies basiert auf der MongoDB-Dokumentation . Schau es dir an.
quelle
Verwalten Sie Mongo-Verbindungspools in einem eigenständigen Modul. Dieser Ansatz bietet zwei Vorteile. Erstens bleibt Ihr Code modular und einfacher zu testen. Zweitens müssen Sie Ihre Datenbankverbindung nicht in Ihrem Anforderungsobjekt verwechseln, das NICHT der Ort für ein Datenbankverbindungsobjekt ist. (Angesichts der Natur von JavaScript würde ich es als sehr gefährlich betrachten, irgendetwas in ein Objekt zu mischen, das aus Bibliothekscode besteht). Damit müssen Sie nur ein Modul berücksichtigen, das zwei Methoden exportiert.
connect = () => Promise
undget = () => dbConnectionObject
.Mit einem solchen Modul können Sie zunächst eine Verbindung zur Datenbank herstellen
Während des Fluges kann Ihre App einfach anrufen,
get()
wenn sie eine DB-Verbindung benötigt.Wenn Sie Ihr Datenbankmodul auf die gleiche Weise wie folgt einrichten, können Sie nicht nur sicherstellen, dass Ihre Anwendung nur dann gestartet wird, wenn Sie über eine Datenbankverbindung verfügen, sondern auch global auf Ihren fehlerhaften Datenbankverbindungspool zugreifen wenn Sie keine Verbindung haben.
quelle
get()
einen Verbindungspool erhalten, nicht eine einzelne Verbindung , wenn wir anrufen . Ein Verbindungspool ist, wie der Name schon sagt, eine logische Sammlung von Datenbankverbindungen. Wenn im Pool keine Verbindungen vorhanden sind, versucht der Treiber, eine zu öffnen. Sobald diese Verbindung geöffnet ist, wird sie verwendet und an den Pool zurückgegeben. Beim nächsten Zugriff auf den Pool wird diese Verbindung möglicherweise wiederverwendet. Das Schöne hier ist, dass der Pool unsere Verbindungen für uns verwaltet. Wenn also eine Verbindung getrennt wird, wissen wir möglicherweise nie, dass der Pool eine neue für uns öffnet.Wenn Sie über Express.js verfügen, können Sie express-mongo-db zum Zwischenspeichern und Freigeben der MongoDB-Verbindung zwischen Anforderungen ohne Pool verwenden (da die akzeptierte Antwort besagt, dass dies der richtige Weg ist, die Verbindung freizugeben).
Wenn nicht, können Sie sich den Quellcode ansehen und ihn in einem anderen Framework verwenden.
quelle
Ich habe Generic-Pool mit Redis-Verbindungen in meiner App verwendet - ich kann es nur empfehlen. Es ist generisch und ich weiß definitiv, dass es mit MySQL funktioniert, also glaube ich nicht, dass Sie Probleme damit und mit Mongo haben werden
https://github.com/coopernurse/node-pool
quelle
Sie sollten eine Verbindung als Dienst erstellen und bei Bedarf wiederverwenden.
mein App.js Beispiel
und verwenden Sie es, wo immer Sie wollen
quelle
http://mongoosejs.com/docs/api.html
Überprüfen Sie die Quelle des Mungos. Sie öffnen eine Verbindung und binden sie an ein Modellobjekt. Wenn das Modellobjekt benötigt wird, wird eine Verbindung zur Datenbank hergestellt. Der Treiber kümmert sich um das Verbindungspooling.
quelle
mongodb
Anschluss.Ich habe den folgenden Code in meinem Projekt implementiert, um das Verbindungspooling in meinem Code zu implementieren, damit eine Mindestverbindung in meinem Projekt erstellt und die verfügbare Verbindung wiederverwendet wird
quelle
Der beste Ansatz zum Implementieren des Verbindungspoolings besteht darin, eine globale Arrayvariable zu erstellen, die den Datenbanknamen mit dem von MongoClient zurückgegebenen Verbindungsobjekt enthält, und diese Verbindung dann wiederzuverwenden, wenn Sie Kontakt mit Database aufnehmen müssen.
Definieren Sie in Ihren Server.js var global.dbconnections = [];
Erstellen Sie einen Dienst mit dem Namen connectionService.js. Es gibt zwei Methoden: getConnection und createConnection. Wenn der Benutzer getConnection () aufruft, findet er Details in der globalen Verbindungsvariablen und gibt Verbindungsdetails zurück, falls bereits vorhanden. Andernfalls ruft er createConnection () auf und gibt Verbindungsdetails zurück.
Rufen Sie diesen Dienst mit db_name auf und er gibt ein Verbindungsobjekt zurück, wenn es bereits ein anderes hat. Es erstellt eine neue Verbindung und gibt sie an Sie zurück.
Ich hoffe es hilft :)
Hier ist der Code von connectionService.js:
quelle
mongodb.com -> neues Projekt -> neuer Cluster -> neue Sammlung -> verbinden -> IP-Adresse: 0.0.0.0/0 & db cred -> verbinden Sie Ihre Anwendung -> kopieren Sie die Verbindungszeichenfolge und fügen Sie sie in die .env-Datei Ihres Knotens ein App und stellen Sie sicher, dass Sie "" durch das tatsächliche Passwort für den Benutzer ersetzen und "/ test" durch Ihren Datenbanknamen ersetzen
neue Datei erstellen .env
quelle
Wenn Sie Express verwenden, gibt es eine andere einfachere Methode: Verwenden Sie die integrierte Express-Funktion, um Daten zwischen Routen und Modulen in Ihrer App auszutauschen. Es gibt ein Objekt namens app.locals. Wir können ihm Eigenschaften hinzufügen und von unseren Routen aus darauf zugreifen. Um es zu verwenden, instanziieren Sie Ihre Mongo-Verbindung in Ihrer app.js-Datei.
Auf diese Datenbankverbindung oder andere Daten, die Sie für die Module Ihrer App freigeben möchten, kann jetzt innerhalb Ihrer Routen
req.app.locals
wie folgt zugegriffen werden, ohne dass zusätzliche Module erstellt und benötigt werden müssen.Diese Methode stellt sicher, dass für die Dauer Ihrer App eine Datenbankverbindung geöffnet ist, es sei denn, Sie möchten sie jederzeit schließen. Es ist leicht zugänglich
req.app.locals.your-collection
und erfordert keine Erstellung zusätzlicher Module.quelle