【发布时间】:2020-10-20 10:08:18
【问题描述】:
我正在尝试了解如何在节点应用程序中维护 mongo 客户端。我的第一个想法是在每次集合检索时创建一个客户端。像这样的:
const getCollection = (collectionName) => {
return MongoClient.connect(url, {useNewUrlParser: true, useUnifiedTopology: true})
.then((client) => {
const database = client.db(databaseName);
return database.collection(collectionName);
})
.catch((err) => {
console.log(err);
});
};
然后使用返回的 promise 进行查询。像这样:
const executeFind = (collectionName, query, projection, skip, limit) => {
return getCollection(collectionName)
.then(collection => {
return collection.find(query, {projection: projection})
.skip(skip)
.limit(limit)
.toArray();
})
.catch((err) => {
console.log(err);
});
};
这种方法的问题在于,在运行应用程序时,与 mongo 的打开连接数会迅速增加,从而导致数据库操作出现问题并出现大量警报。
我考虑的连接增加的可能原因:
- 大型池 - 我尝试将
maxPoolSize=5添加到 URL。还将poolSize: 5添加到options(MongoClient 的connect函数的第二个参数。连接数仍然会激增。 - 缺少连接关闭 - 我现在找不到文档,但我在某处读到连接由客户端本身管理,因此无需考虑
close()对它们进行操作。但无论如何,我尝试在collection.find()返回结果后将代码重写为客户端close()。我收到Cannot use a session that has ended
除此之外,我没有任何其他想法要以一种在资源分配/运行方面有效的方式维护 mongo 客户端。我想听听这两个方面的答案:
- 1。在这种方法中究竟可以做些什么来避免打开连接增加?
- 2。维护mongo客户端的更通用/最佳/最佳实践方式是什么。
【问题讨论】:
标签: node.js mongodb express connection