next.js和mongodb地图集-收到“连接数已配置限制的百分比已超过80”警报

问题描述 投票:1回答:1

[我在MongoDB Atlas上看到了很多有关此警报的文章和文章(“连接数已配置的限制已超过80”,但无法在Next.js应用程序中弄清楚如何解决它。

我在处理程序函数之外创建数据库连接。我使用了中间件withDatabase.js

const client = new MongoClient(process.env.MONGODB_URI, { 
    useNewUrlParser: true, 
    useUnifiedTopology: true 
});

const addDbToRequest = (handler, req, res) => {
    req.db = req.connection.db("MYDBNAME");
    return handler(req, res);
};

const withDatabase = handler => async (req, res) => {
    if (!client.isConnected()) {
        await client.connect();
    }
    req.connection = client;
    return addDbToRequest(handler, req, res);
};

export default withDatabase;

此中间件包装了API端点处理程序。

现在,如果完成时我关闭了每个API处理程序上的连接,如下所示:

    const { connection } = req;
    if (connection) {
        connection.close();
    }

谢谢,我在对相同api处理程序的第二个请求中遇到错误:

MongoError: Topology is closed, please connect

并且,如果我没有关闭连接,则我会在短时间使用后收到此警报:

Connections % of configured limit has gone above 80

在Next.js应用程序中与MongoDB Atlas一起使用的最佳实践是什么?

谢谢!

mongodb next.js mongodb-atlas
1个回答
0
投票

由于以下原因,应重新使用该连接:

  1. 在每个API请求上打开和关闭数据库连接很慢。
  2. 几乎不可扩展。假设您正在为每个用户同时发出几个API请求,那么当应用获得更多用户时,您将很快达到相同的连接限制。

How do I manage MongoDB connections in a Node.js web application?

默认MongoClient配置将每个池的最大连接数(poolSize)设置为5。因此,如果仅运行一个应用程序实例并像您一样检查客户端是否已连接,则在MongoDB Atlas中看到的连接不应超过5个。

if (!client.isConnected()) {
  await client.connect();
}

注意,在开发模式(next dev)中,Next.js在每个请求上都会“重新启动”,似乎会影响MongoClient缓存并创建许多连接。但是,在生产模式下,您不应遇到此问题。

© www.soinside.com 2019 - 2024. All rights reserved.