当前位置: 首页 > 知识库问答 >
问题:

如何在Node.js web应用程序中管理MongoDB连接?

姜凯风
2023-03-14

我正在使用带有MongoDB的Node-MongoDB本机驱动程序来编写一个网站。

我有一些关于如何管理连接的问题:

>

  • 对所有请求只使用一个MongoDB连接是否足够?是否存在性能问题?如果不是,我可以设置一个全局连接在整个应用程序中使用吗?

    如果不是,如果我在请求到达时打开一个新的连接,并且在处理请求时关闭它,这是好的吗?打开和关闭一个连接是否昂贵?

    我应该使用全局连接池吗?我听说驱动程序有一个本机连接池。是一个好的选择吗?

    如果我使用连接池,应该使用多少个连接?

    还有其他事情我应该注意吗?

  • 共有2个答案

    郤望
    2023-03-14

    在node.js应用程序启动时打开一个新连接,并重用现有的db连接对象:

    import express from 'express';
    import Promise from 'bluebird';
    import logger from 'winston';
    import { MongoClient } from 'mongodb';
    import config from './config';
    import usersRestApi from './api/users';
    
    const app = express();
    
    app.use('/api/users', usersRestApi);
    
    app.get('/', (req, res) => {
      res.send('Hello World');
    });
    
    // Create a MongoDB connection pool and start the application
    // after the database connection is ready
    MongoClient.connect(config.database.url, { promiseLibrary: Promise }, (err, db) => {
      if (err) {
        logger.warn(`Failed to connect to the database. ${err.stack}`);
      }
      app.locals.db = db;
      app.listen(config.port, () => {
        logger.info(`Node.js app is listening at http://localhost:${config.port}`);
      });
    });
    
    import { Router } from 'express';
    import { ObjectID } from 'mongodb';
    
    const router = new Router();
    
    router.get('/:id', async (req, res, next) => {
      try {
        const db = req.app.locals.db;
        const id = new ObjectID(req.params.id);
        const user = await db.collection('user').findOne({ _id: id }, {
          email: 1,
          firstName: 1,
          lastName: 1
        });
    
        if (user) {
          user.id = req.params.id;
          res.send(user);
        } else {
          res.sendStatus(404);
        }
      } catch (err) {
        next(err);
      }
    });
    
    export default router;
    
    桑鸿志
    2023-03-14

    node-mongodb-native的主要提交者说:

    在应用程序启动时打开do MongoClient.Connect,并重用db对象。它不是一个单独的连接池。connect创建一个新的连接池。

    因此,要直接回答您的问题,请重用从mongoclient.connect()生成的db对象。这为您提供了池,与在每个db操作上打开/关闭连接相比,将提供显著的速度提高。

     类似资料:
    • 问题内容: 我在MongoDB中使用node-mongodb-native驱动程序来编写网站。 我对如何管理连接有一些疑问: 仅使用一个MongoDB连接就可以处理所有请求是否足够?是否存在性能问题?如果没有,是否可以设置全局连接以在整个应用程序中使用? 如果没有,如果在请求到达时打开一个新连接,并在处理请求时将其关闭,那会很好吗?打开和关闭连接是否昂贵? 我应该使用全局连接池吗?我听说驱动程序具

    • 问题内容: 我正在将MongoDB与Java结合使用,并且对我的连接存在一些问题。首先,我应该如何连接到Mongo?我应该使用静态客户端并保持打开状态吗?因为连接大约需要500毫秒。因此,在用户需要数据时始终连接它不是最好的主意吗? 但是接下来的问题是。当我进行一些查询时,我收到错误消息或。 那么,我应该如何管理整个MongoDB连接呢?始终等待500毫秒是减慢速度并在10个连接不太好之后重启服务

    • Windows NT Option Pack 提供了在 Web 服务器上的 ASP 应用程序管理服务。例如,Internet 服务管理器为应用程序开发人员提供了一个使用简便的管理工具来设置应用程序的属性。另外,Active Server Pages 提供了允许用户的应用程序存储全局数据的脚本功能。本主题简要介绍部分应用程序管理功能,并提供到详细信息的链接。 启动和结束应用程序 当 Web 服务器第

    • 我刚刚使用带有依赖项的Spring工具套件创建了一个非常基本的Spring Boot项目,并运行了该应用程序,但是,我总是遇到以下异常 2019-11-27 00:31:19.699信息11988---[localhost:27017]org.mongodb.driver.cluster:连接到服务器时监视器线程出现异常localhost:27017 我错过了什么?

    • 我的主文件app.js连接到userDB我想添加第二个数据库postsDB 常量mongoose=require(“mongoose”); 常量app=express(); mongoose.set(“UseCreateIndex”,true);mongoose.set(“UseUnifiedTopology”,true); Mongoose.connect(“MongoDB://localhos

    • Rails 是一个非常受欢迎的 Web 应用程序框架(从某种意义上说,是由于它被广泛应用而不是人们真正喜欢它)。 因此,在某些时候,你可能会被要求管理它。 本节要介绍的处方包含了安装一台运行 Rails 应用程序服务器所要做的绝大部分工作。 本处方假定你会使用 Nginx 和 Passenger 作为 Web 服务器, 然而你也可以轻松地修改本处方,使用 Apache 替换它。 操作步骤 创建 r