提问者:小点点

nodejs mongodb连接池问题


我正在尝试在我的节点应用程序中使用连接池,但是它没有像预期的那样工作。下面是我的代码:

import dotenv from 'dotenv';
import MongoClient from 'mongodb';

dotenv.config();

let db;

export async function getDb() {
  if (db) {
    console.log('reusing db connection');
    return db;
  }
  try {
    const conn = await MongoClient.connect(process.env.DEV_URI,
                                           { useUnifiedTopology: true,
                                             maxPoolSize: 5 });
    console.log('db connection created');
    db = conn.db('dev');
  } catch (err) {
    console.log(err);
  }
  return db;
}

这是

import { getDb } from './db.js';

async function foo() {
  const db = await getDb();
}

async function bar() {
  const db = await getDb();
}

// This outputs 8 lines of 'db connection created'
foo(); bar();
foo(); bar();
foo(); bar();
foo(); bar();

所以运行app.js时,我预计最多只会创建5个连接,但是每个foo()和bar()都会创建一个新的集合。如何使每个异步操作都能在池中挑选一个空闲连接?


共1个答案

匿名用户

我认为你做得太快了:)所有的异步函数都是一次执行的,所以当每一个启动时,都没有连接。

尝试在调用;bar()/code>。

另一种解决方案是在中使用某种互斥量或信号量。