【问题标题】:Handling Database reconnections with MongoDB Native Driver in Node.JS在 Node.JS 中使用 MongoDB 本机驱动程序处理数据库重新连接
【发布时间】:2022-03-24 20:39:22
【问题描述】:

使用 mongoose 可以简单地通过连接选项处理重新连接:

let dbOptions = {
    dbName: process.env.MONGO_DATABASE_NAME,
    autoReconnect: true,
    reconnectInterval: 1000,
    reconnectTries: 10,
};

mongoose.connect(process.env.MONGO_URI, dbOptions);
// Create connection object.
const db = mongoose.connection;

在本机 MongoDB 驱动程序(4.4 版)中,没有可用的类似连接选项: https://mongodb.github.io/node-mongodb-native/4.4/interfaces/MongoClientOptions.html

在发生重大错误时处理数据库重新连接的最简单方法是什么?

【问题讨论】:

  • 有一个选项keepAlive,默认为true,不用改,你的问题不清楚,case of a major error > 什么样的错误,在您的问题中添加更多详细信息。
  • @turivishal 感谢您的回复。非常感谢。重大错误是指如果我的数据库关闭了几分钟,我希望我的 node.js 服务器自动尝试重新连接。
  • 它应该重新连接,我不确定但该错误来自节点,因此您必须处理 nodejs 中的错误。请发布错误和您的示例连接代码。

标签: node.js mongodb


【解决方案1】:

无论您从哪里获得 mongoose 连接 sn-p,它都已过时。

autoReconnectauto_reconnect 选项是 v4.0 之前的 Nodejs 原生驱动程序中的一个东西,而 mongoose 只是将这些选项代理到驱动程序。

这是带有“autoReconnect”的驱动程序 3.7 的文档:http://mongodb.github.io/node-mongodb-native/3.7/api/global.html#MongoClientOptions,这是已被删除的提交:https://github.com/mongodb/node-mongodb-native/commit/e3cd9e684aea99be0430d856d6299e65258bb4c3#diff-f005e84d9066ef889099ec2bd907abf7900f76da67603e4130e1c92fac92533dL90

该选项默认为“True”,并强烈说明不要更改此值,除非您确切知道为什么需要禁用它。

v4 对驱动程序进行了许多更改——重构为 typescript,架构更改,您可以从提交中看到它,对。其中一项更改影响了连接逻辑和池管理。不再有禁用重新连接的选项。无论您如何直接连接或通过猫鼬连接,它总是会重新连接。

【讨论】:

  • 它将尝试重新连接多少次?如果我启动我的服务器,关闭数据库 3 小时然后再次打开它会怎样? node.js 服务器会不会自动重新连接而无需任何额外代码?
  • 如果您阅读问题中提到的客户端选项文档,有许多选项可以控制连接的不同方面 - connectionTimeoutMS、socketTimeoutMS、heartbeatFrequencyMS、wtimeoutMS 等。对于您的 3 小时停电示例 - 它会尝试在第一次操作时重新连接一次。 mongodb.github.io/node-mongodb-native/3.6/reference/… 解释了这些变化背后的想法和理由。从 v4.0 开始,他们放弃了对传统拓扑的支持。
  • 这应该被标记为正确答案,因为当没有活动的池连接时,驱动程序将尝试连接到数据库并执行您请求的数据库操作。如果没有可用的数据节点,则该操作将失败。如果您担心发生故障转移时操作失败,我建议利用此处找到的可重试读/写:mongodb.com/docs/manual/reference/connection-string/…
  • @Scott,不能不同意 =) 我真的相信这是一个正确的答案。坦率地说,我数不清 OP 分配了多少次赏金。在回答时,它是“从有信誉的来源获得答案”,所以我在答案中放了几个相当有信誉的链接。这次它说“帮我解决问题”,但没有明确的问题陈述,只有一个问题,什么是最简单的重新连接方法。我怀疑有比在应用层什么都不做更简单的方法。显然它并没有解决任何 OPs 问题,所以我放弃了帮助。
  • 好吧好吧,你得到了赏金。感谢您的帮助@AlexBlex
猜你喜欢
  • 2014-07-04
  • 2013-04-14
  • 1970-01-01
  • 1970-01-01
  • 2017-02-25
  • 2016-11-09
  • 1970-01-01
  • 2018-05-24
  • 1970-01-01
相关资源
最近更新 更多