使用Node.JS中的MongoDB原生驱动程序处理数据库重新连接问题。

6
使用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,无需更改。你的问题不够清晰,在出现重大错误时 > 是什么类型的错误,请在你的问题中添加更多细节。 - turivishal
@turivishal 谢谢您的回复。非常感谢。所谓的主要错误是指,如果我的数据库宕机了几分钟,我希望我的node.js服务器能够自动尝试重新连接。 - thelearner
1
它应该重新连接,我不确定,但这个错误来自node,所以你必须在nodejs中处理错误。请发布错误和您的样本连接代码。 - turivishal
1个回答

2
无论你从哪里获取了mongoose连接片段,它都已经过时了。
在Nodejs原生驱动程序v4.0之前,autoReconnectauto_reconnect选项是存在的,而mongoose只是将这些选项代理到驱动程序中。
这是驱动程序3.7的文档,其中仍然有"autoReconnect":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,架构更改,您可以从提交中看到。其中一项更改影响了连接逻辑和池管理。不再有禁用重新连接的选项。它始终会重新连接,无论您是直接连接还是通过mongoose连接。

它会尝试重新连接多少次?如果我启动服务器,关闭数据库3个小时,然后再次打开,Node.js服务器是否会自动重新连接而无需任何其他代码? - thelearner
1
如果您阅读了您在问题中提到的客户端选项文档,就会发现有许多选项可以控制连接的不同方面 - connectionTimeoutMS、socketTimeoutMS、heartbeatFrequencyMS、wtimeoutMS等。对于您的3小时断电示例 - 它将在第一次操作时尝试重新连接一次。https://mongodb.github.io/node-mongodb-native/3.6/reference/unified-topology/解释了这些更改背后的思想和原理。从v4.0开始,他们停止支持旧拓扑结构。 - Alex Blex
1
当没有池化连接处于活动状态时,应将此标记为正确答案,驱动程序将尝试连接到数据库并执行请求的数据库操作。如果没有可用的数据节点,则该操作将失败。如果您担心故障转移发生时操作失败,建议使用在此处找到的可重试读/写:https://www.mongodb.com/docs/manual/reference/connection-string/#mongodb-urioption-urioption.retryReads - Scott
1
@Scott,不能不同意=)我真的相信这是一个正确的答案。坦白地说,我已经失去了对OP分配赏金的计数。在回答时,它是“从可靠来源获取答案”,所以我在答案中放了几个相当可靠的链接。这一次它说“帮助我解决问题”,但没有明确的问题陈述,只有一个问题,什么是重新连接的最简单方法。我怀疑除了在应用程序层上什么都不做之外,没有比这更简单的方法了。显然,无论问题是什么,它都没有解决OP的问题,所以我放弃了试图帮助。 - Alex Blex
好的好的好的,你获得了赏金。感谢你的帮助 @AlexBlex - thelearner

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