何时关闭MongoDB连接

10

背景是,我正在编写一个ExpressJS应用程序,并使用MongoDB的Node驱动程序mongodb

应用程序有时需要快速访问远程数据库,这取决于用户的活动频率。我知道应用程序不应该每次需要数据时都打开和关闭连接。它应该连接一次,并且应该有一个名为db的东西可供查询,例如:db.collection("users").find(...),所有未来的数据库调用都只需使用该db变量。

但是如果我部署我的应用程序,我假设server.js仅在应用程序生命周期的开始执行一次。那将意味着在整个部署的生命周期中只进行一次连接。

但是这些连接不会超时吗?我只需检查db变量是否为打开状态,如果不是,则在进行调用之前重新连接?

令人惊讶的是,我没有找到很多指南,所以我不知道正确的方法,这就是为什么我在这里提出问题的原因。如果可以提出更好的问题,请告诉我。

1个回答

14

您无需自行管理连接。MongoClient.connect调用已经包含了所有必要的内容。请参阅文档:connect方法包括autoReconnect(默认为true),它将尝试保持连接可用。您还可以使用poolSize(默认为5)为客户端(您可以在整个应用程序中保存和重复使用)提供使用多个连接的机会。

完整示例:

const { MongoClient } = require('mongodb');

const url = 'mongodb://localhost:27017';

MongoClient.connect(url)
    .then(client => runMyApp(client));

function runMyApp(client) {
    // Use client however you like e.g.
    client.db('users').find({})
        .then((results) => console.log(results));
}

2
所以说我确实不需要写client.close(),我只需要像这样连接一次:var client = MongoClient.connect(url, (err, client) => client ); - nth-chile
1
不,因为MongoClient.connect调用是异步的...你真的需要理解JS中的异步性。YDKJS是一个很好的资源,但需要一些阅读的投入。Mongoose通常是每个人在Node上使用的ORM,因此大多数博客文章都基于Mongoose。 - danielgormly
1
我认为我遇到困难的唯一原因是我不想把整个应用程序放在回调函数中。你的意思是我甚至应该把所有的路由都放在那里吗?我正在寻找一种方法来将“客户端”分配给全局变量,并从任何地方使用它,也许在调用之前检查是否需要重新建立连接。我没有使用Mongoose,因为我喜欢用困难的方式来理解为什么会有更先进的工具。 - nth-chile
让我们在聊天中继续这个讨论 - danielgormly
@nth-chile:你有没有找到任何理由,说明我们在应用程序中(除了在应用程序终止时进行清理)不应该使用.close()?我遇到了严重的内存泄漏问题,这导致我的服务器崩溃,我怀疑不在每个查询上使用.connect()和.close()可能是原因。 - Shashank Srivastava
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接