J'utilise le pilote natif de node-mongodb avec MongoDB pour écrire un site Web.
J'ai des questions sur la gestion des connexions:
Est-ce suffisant d'utiliser une seule connexion MongoDB pour toutes les demandes? Y a-t-il des problèmes de performances? Sinon, puis-je configurer une connexion globale à utiliser dans l'ensemble de l'application?
Si ce n'est pas le cas, est-ce bien d'ouvrir une nouvelle connexion lorsque la demande arrive et de la fermer lors du traitement de la demande? Est-il coûteux d'ouvrir et de fermer une connexion?
Dois-je utiliser un pool de connexions global? J'entends que le pilote a un pool de connexion natif. est-ce un bon choix?
Si j'utilise un pool de connexions, combien de connexions doivent être utilisées?
Y a-t-il d'autres choses que je devrais remarquer?
Réponses:
Le committer principal de node-mongodb-native dit :
Donc, pour répondre directement à votre question, réutilisez l'objet db qui en résulte
MongoClient.connect()
. Cela vous donne la mise en commun et fournira une augmentation de vitesse notable par rapport à l'ouverture / fermeture des connexions à chaque action db.la source
req.db
avec ce middleware: github.com/floatdrop/express-mongo-dbOuvrez une nouvelle connexion lorsque l'application Node.js démarre et réutilisez l'
db
objet de connexion existant :/server.js
/api/users.js
Source: Comment ouvrir des connexions de base de données dans une application Node.js / Express
la source
Voici du code qui gérera vos connexions MongoDB.
Lorsque vous démarrez le serveur, appelez
initPool
Ensuite, dans tout autre module, vous pouvez effectuer les opérations suivantes:
Ceci est basé sur la documentation MongoDB . Jetez un coup d'oeil.
la source
Gérez les pools de connexions mongo dans un seul module autonome. Cette approche présente deux avantages. Premièrement, il maintient votre code modulaire et plus facile à tester. Deuxièmement, vous n'êtes pas obligé de mélanger votre connexion à la base de données dans votre objet de demande qui n'est PAS l'endroit pour un objet de connexion à la base de données. (Étant donné la nature de JavaScript, je considérerais qu'il est très dangereux de mélanger quoi que ce soit à un objet construit par le code de bibliothèque). Donc, avec cela, il vous suffit de considérer un module qui exporte deux méthodes.
connect = () => Promise
etget = () => dbConnectionObject
.Avec un tel module, vous pouvez d'abord vous connecter à la base de données
En vol, votre application peut simplement appeler
get()
lorsqu'elle a besoin d'une connexion DB.Si vous configurez votre module db de la même manière que ci-dessous, vous aurez non seulement un moyen de vous assurer que votre application ne démarrera pas, sauf si vous disposez d'une connexion à la base de données, mais vous disposez également d'un moyen global d'accéder à votre pool de connexion à la base de données qui entraînera des erreurs si vous n'avez pas de connexion.
la source
get()
nous obtenons un pool de connexions et non une seule connexion. Un pool de connexions, comme son nom l'indique, est une collection logique de connexions à la base de données. S'il n'y a aucune connexion dans le pool, le pilote tentera d'en ouvrir une. Une fois cette connexion ouverte, elle est utilisée et renvoyée dans le pool. La prochaine fois que vous accéderez au pool, cette connexion pourra être réutilisée. La bonne chose ici est que la piscine gérera nos connexions pour nous, donc si une connexion est interrompue, nous ne le saurons peut-être jamais car la piscine en ouvrira une nouvelle pour nous.Si vous avez Express.js, vous pouvez utiliser express-mongo-db pour mettre en cache et partager la connexion MongoDB entre les demandes sans pool (car la réponse acceptée indique que c'est la bonne façon de partager la connexion).
Sinon, vous pouvez consulter son code source et l'utiliser dans un autre cadre.
la source
J'ai utilisé un pool générique avec des connexions redis dans mon application - je le recommande vivement. Son générique et je sais certainement qu'il fonctionne avec mysql, donc je ne pense pas que vous aurez des problèmes avec cela et mongo
https://github.com/coopernurse/node-pool
la source
Vous devez créer une connexion en tant que service, puis la réutiliser en cas de besoin.
mon exemple App.js
et utilisez-le où vous voulez avec
la source
http://mongoosejs.com/docs/api.html
Découvrez la source de Mongoose. Ils ouvrent une connexion et la lient à un objet Model. Ainsi, lorsque l'objet Model est requis, une connexion est établie avec la base de données. Le pilote s'occupe de la mise en commun des connexions.
la source
mongodb
.J'ai implémenté le code ci-dessous dans mon projet pour implémenter le regroupement de connexions dans mon code afin qu'il crée une connexion minimale dans mon projet et réutilise la connexion disponible
la source
La meilleure approche pour implémenter le regroupement de connexions consiste à créer une variable de tableau global contenant le nom de la base de données avec l'objet de connexion renvoyé par MongoClient, puis à réutiliser cette connexion chaque fois que vous devez contacter Database.
Dans votre Server.js, définissez var global.dbconnections = [];
Créez un service nommant connectionService.js. Il aura 2 méthodes getConnection et createConnection. Ainsi, lorsque l'utilisateur appellera getConnection (), il trouvera des détails dans la variable de connexion globale et renverra les détails de connexion s'il existe déjà sinon il appellera createConnection () et renverra les détails de connexion.
Appelez ce service en utilisant db_name et il renverra l'objet de connexion s'il en a déjà un autre, il créera une nouvelle connexion et vous le renverra.
J'espère que ça aide :)
Voici le code connectionService.js:
la source
mongodb.com -> nouveau projet -> nouveau cluster -> nouvelle collection -> connect -> adresse IP: 0.0.0.0/0 & db cred -> connectez votre application -> copiez la chaîne de connexion et collez le fichier .env de votre nœud et assurez-vous de remplacer "" par le mot de passe réel de l'utilisateur et de remplacer "/ test" par votre nom de base de données
créer un nouveau fichier .env
la source
Si vous utilisez express, il existe une autre méthode plus simple, qui consiste à utiliser la fonction intégrée d'Express pour partager des données entre les routes et les modules de votre application. Il existe un objet appelé app.locals. Nous pouvons y attacher des propriétés et y accéder depuis l'intérieur de nos itinéraires. Pour l'utiliser, instanciez votre connexion mongo dans votre fichier app.js.
Cette connexion à la base de données, ou en fait toute autre donnée que vous souhaitez partager autour des modules de votre application, est désormais accessible dans vos itinéraires avec
req.app.locals
comme ci-dessous sans avoir besoin de créer et de nécessiter des modules supplémentaires.Cette méthode garantit que vous avez une connexion à la base de données ouverte pour la durée de votre application, sauf si vous choisissez de la fermer à tout moment. Il est facilement accessible avec
req.app.locals.your-collection
et ne nécessite pas la création de modules supplémentaires.la source