Nodejs 求助 mongodb 连接数1万多

Nodejs 求助 mongodb 连接数1万多

求助下。我mongodb 连接数不断增长。不释放。 操作环境 centos 6.5 x64 ,mongodb 2.4.6 连接数到1w多就挂了。 前端使用的PHP 看日志很多connections now open,请各位分享下如何优化呀。 我启动命令 mongod --dbpath /data/shard/p00 --port 50001 --fork --logpath /log/p00.log

连接数截图


6 回复

Node.js 求助 MongoDB 连接数1万多

背景信息

在使用 Node.js 应用程序连接 MongoDB 数据库时,遇到了连接数不断增长且不释放的问题。当连接数达到1万多个时,系统开始出现问题,前端的 PHP 程序也无法正常工作。日志显示有大量的 connections now open 记录。

解决方案

这个问题可能是由于没有正确地管理数据库连接导致的。在 Node.js 中,应该确保每次请求完成后及时关闭数据库连接。此外,可以考虑使用连接池来管理连接。

示例代码

以下是一个简单的示例,展示如何使用 mongodb 包中的连接池来管理数据库连接:

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:50001";
const dbName = 'myproject';
const client = new MongoClient(url, { useNewUrlParser: true, useUnifiedTopology: true });

async function connectAndQuery() {
    try {
        await client.connect();
        console.log("Connected successfully to server");

        const db = client.db(dbName);
        const collection = db.collection('documents');

        // 执行查询操作
        const result = await collection.find({}).toArray();
        console.log(result);

        // 确保在操作完成后关闭连接
        client.close();
        console.log("Connection closed");
    } catch (err) {
        console.error(err.stack);
    }
}

// 在实际应用中,可以将 connectAndQuery 放在一个请求处理函数中
connectAndQuery();
解释
  • 连接池:通过设置 useNewUrlParseruseUnifiedTopology,MongoDB 客户端会自动使用连接池管理连接。
  • 连接管理:确保在完成所有数据库操作后调用 client.close() 关闭连接。
  • 错误处理:使用 try-catch 块来捕获并处理可能发生的错误。

其他建议

  1. 监控连接数:使用 MongoDB 的监控工具(如 mongostatmongotop)来监控当前的连接数,并在连接数接近阈值时采取措施。
  2. 调整 MongoDB 配置:可以在 mongod.conf 文件中增加最大连接数限制,例如:
    net:
      maxIncomingConnections: 15000
    
  3. 检查代码逻辑:确保在每个请求或任务完成后正确关闭数据库连接,避免长时间保持连接。

通过以上步骤,应该能够有效解决 MongoDB 连接数不断增长的问题。


我连接它的时候总是会出现 throw new Error(‘Required MongoStore option db missing’);错误。

php 为啥不用mysql?

  1. php设定连接数
  2. mdb数据库设置绑定php服务器ip

应用服务器是啥?

根据你的描述,MongoDB 的连接数不断增长且没有释放,这通常是因为连接池管理不当或者在代码中没有正确关闭数据库连接。

可能的原因

  1. 未正确关闭连接:每次请求后未正确关闭数据库连接。
  2. 连接池配置不合理:默认的连接池大小可能过小或过大。
  3. 频繁创建连接:代码中频繁地创建新的连接而没有重用现有的连接。

示例代码与优化建议

假设你使用的是 mongodb 包,下面是一个简单的 Node.js 应用程序示例,展示如何正确管理 MongoDB 连接:

const MongoClient = require('mongodb').MongoClient;

// 使用单一全局数据库连接
let db;

async function connect() {
    const url = 'mongodb://localhost:50001';
    const dbName = 'myproject';

    MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
        if (err) {
            console.error('Error connecting to MongoDB', err);
            return;
        }
        console.log("Connected successfully to server");
        db = client.db(dbName);
    });
}

// 在应用启动时调用
connect();

// 在处理请求时使用已连接的数据库
app.get('/some-route', async (req, res) => {
    try {
        const result = await db.collection('some-collection').find({}).toArray();
        res.json(result);
    } catch (err) {
        console.error('Error querying database', err);
        res.status(500).send('Internal Server Error');
    }
});

解释

  • 全局连接:通过全局变量 db 存储数据库连接,确保整个应用程序只使用一个数据库连接。
  • 错误处理:确保在连接失败时有适当的错误处理。
  • 统一的连接配置:使用 useNewUrlParseruseUnifiedTopology 避免潜在的兼容性问题。

其他优化建议

  1. 检查代码逻辑:确保每次请求后都正确关闭连接。
  2. 调整连接池大小:可以在 MongoClient.connect 方法中设置 poolSize 参数来调整连接池大小。
  3. 监控连接数:定期监控连接数,确保它保持在一个合理的范围内。

如果以上方法仍然不能解决问题,建议检查 PHP 端的连接情况,确保其也正确地管理和关闭了连接。

回到顶部