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

我在MongoDB中使用node-mongodb-native驱动程序来编写网站。

我对如何管理连接有一些疑问:

  1. 仅使用一个MongoDB连接就可以处理所有请求是否足够?有性能问题吗?如果没有,是否可以设置全局连接以在整个应用程序中使用?

  2. 如果不是,请问在请求到达时打开一个新连接,并在处理请求时将其关闭,这会很好吗?打开和关闭连接是否昂贵?

  3. 我应该使用全局连接池吗?我听说驱动程序具有本地连接池。这是一个好选择吗?

  4. 如果使用连接池,应使用多少个连接?

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

Tony梅2020/03/19 12:33:47

http://mongoosejs.com/docs/api.html

查看猫鼬的来源。他们打开一个连接并将其绑定到Model对象,因此当需要Model Object时,将与数据库建立连接。驱动程序负责连接池。

西里古一2020/03/19 12:33:47

您应该将连接创建为服务,然后在需要时重用它。

// db.service.js
import { MongoClient } from "mongodb";
import database from "../config/database";

const dbService = {
  db: undefined,
  connect: callback => {
    MongoClient.connect(database.uri, function(err, data) {
      if (err) {
        MongoClient.close();
        callback(err);
      }
      dbService.db = data;
      console.log("Connected to database");
      callback(null);
    });
  }
};

export default dbService;

我的App.js示例

// App Start
dbService.connect(err => {
  if (err) {
    console.log("Error: ", err);
    process.exit(1);
  }

  server.listen(config.port, () => {
    console.log(`Api runnning at ${config.port}`);
  });
});

并在任何需要的地方使用

import dbService from "db.service.js"
const db = dbService.db
梅番长2020/03/19 12:33:47

我一直在我的应用程序中使用带有Redis连接的通用池-我强烈推荐它。它是通用的,我当然知道它可以与mysql一起使用,所以我认为您和mongo不会遇到任何问题

https://github.com/coopernurse/node-pool

乐Jim2020/03/19 12:33:47

如果您拥有Express.js,则可以使用express-mongo-db在没有池的情况下在请求之间缓存和共享MongoDB连接(因为接受的答案说这是共享连接的正确方法)。

如果不是,您可以查看其源代码并在另一个框架中使用它。

ALEYHarry2020/03/19 12:33:47

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

您的应用程序启动并重新使用db对象时,只需打开一次do MongoClient.connect。每个.connect都不是一个单例连接池。

因此,要直接回答您的问题,请重复使用产生的db对象MongoClient.connect()与每个数据库操作上的打开/关闭连接相比,这可以为您提供缓冲,并可以显着提高速度。