新手问题:Nodejs 每次操作mongo都要connect,close?

新手问题:Nodejs 每次操作mongo都要connect,close?

var MongoClient = require(‘mongodb’).MongoClient;

MongoClient.connect(“mongodb://localhost:27017/integration_test”, function(err, db) { test.equal(null, err); test.ok(db != null);

db.collection(“replicaset_mongo_client_collection”).update({a:1}, {b:1}, {upsert:true}, function(err, result) { test.equal(null, err); test.equal(1, result);

db.close();
test.done();

}); }); 这样太不科学了把


12 回复

在Node.js中与MongoDB进行交互时,频繁地打开和关闭数据库连接并不是一个高效的实践。通常的做法是创建一个全局的数据库连接池,这样可以在应用程序的不同部分重复使用这个连接。这不仅提高了性能,还减少了资源消耗。

以下是一个改进的例子,展示了如何创建一个全局的数据库连接,并在需要的时候重用它:

示例代码

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017";
const dbName = "integration_test";
let db;

// 创建全局数据库连接
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true })
  .then(client => {
    console.log("Connected successfully to server");
    db = client.db(dbName);
  })
  .catch(err => console.error("Connection error", err));

// 定义一个函数来执行更新操作
async function updateCollection() {
  try {
    const result = await db.collection("replicaset_mongo_client_collection").update(
      { a: 1 },
      { b: 1 },
      { upsert: true }
    );
    console.log(result);
  } catch (err) {
    console.error("Update error", err);
  }
}

// 在需要的地方调用该函数
updateCollection();

// 当应用结束时关闭数据库连接
process.on('SIGINT', () => {
  db.client.close()
    .then(() => process.exit())
    .catch(err => console.error("Close error", err));
});

解释

  1. 全局数据库连接:我们只在应用启动时建立一次数据库连接,并将连接对象存储在一个全局变量 db 中。

  2. 异步函数updateCollection 函数用于执行更新操作,通过 await 关键字等待异步操作完成。

  3. 错误处理:在每个可能出错的地方添加了错误处理逻辑,以确保应用的健壮性。

  4. 关闭连接:当应用接收到终止信号(例如Ctrl+C)时,通过监听 SIGINT 事件来优雅地关闭数据库连接。

这种方法避免了每次操作都需要重新连接的开销,使代码更加简洁和高效。


用mongoose等模型工具来写,能省心不少 …

恩! 我看看,谢谢。 var db = MongoClient.connect(“mongodb://localhost:27017/integration_test”); 我试着这样写,但是报错了,大家是怎么做的了?每次都connect,close吗?为什么这么做了?

为啥不科学,挺科学的

新手不懂,为啥呢?给我讲讲撒

能不用回调方式来连接数据库吗

数据库有最大连接数的限制

用链接池吧, nodejs不适合使用短连接, 用连接池只需要维护这个连接池就好了

恩,用mongo 是为了简便,结果发现比mysql还麻烦,还是决定用mysql了,mysql2预处理,链接池这些都有

恩 这个知道

把所有数据库操作写在mongo.open的回调里面,不用一直开关

对于这个问题,确实每次操作数据库都进行连接和关闭并不是最高效的方法。通常我们会使用一个全局的数据库连接实例,或者使用连接池来管理数据库连接。

示例代码

这里提供一个使用mongodb模块并且保持连接持久性的方法:

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017";
const dbName = 'integration_test';

let dbInstance;

async function connectToDatabase() {
    if (!dbInstance) {
        const client = new MongoClient(url, { useNewUrlParser: true, useUnifiedTopology: true });
        await client.connect();
        console.log("Connected to MongoDB!");
        dbInstance = client.db(dbName);
    }
    return dbInstance;
}

async function updateDocument() {
    const db = await connectToDatabase();
    
    db.collection("replicaset_mongo_client_collection").update(
        { a: 1 }, 
        { b: 1 }, 
        { upsert: true }, 
        (err, result) => {
            if (err) throw err;
            console.log(result);
        }
    );
}

// 使用示例
updateDocument().then(() => {
    console.log("Update operation completed.");
}).catch(error => {
    console.error("Error during update:", error);
});

解释

  • connectToDatabase: 这个函数负责连接到数据库,并确保只创建一个连接实例。如果已经存在连接实例,则直接返回该实例。
  • updateDocument: 这个函数执行更新操作。它首先调用connectToDatabase获取数据库连接,然后对集合进行操作。

这种方式可以避免频繁地建立和关闭数据库连接,从而提高应用性能。

回到顶部