摘要:个人认为,这种方式相比一直等待数据库重连直到响应超时体验要更佳一点。当然,以上这套最佳实践还存在一个不足如果服务初次启动后未能成功连接数据库比如数据库此时处于宕机状态,则服务不会尝试重连数据库。
关于如何处理 node.js 服务连接 MongoDB,我查阅了大量中英文资料,发现并没有太适合我所期望的能力的方案,因此经过一番官方文档的研究,总结了以下的连接 MongoDB 的方法(使用目前 Node.js 平台最常用的 MongoDB ODM mongoose),斗胆称之为『最佳实践』,希望能够抛砖引玉,得到大家更专业的解答。
话不多说,先上代码:
const mongoose = require("mongoose") const config = require("./config") if (process.env.NODE_ENV === "development") { mongoose.set("debug", true) /* A */ } mongoose.set("bufferCommands", false) /* B */ function connectMongoDB(address) { try { mongoose.connect(address, { useNewUrlParser: true, bufferMaxEntries: 0 /* B */ autoReconnect: true /* C, default is true, you can ignore it */ poolSize: 5 /* D, default is 5, you can ignore it */ }) const db = mongoose.connection db.on("error", (error) => { console.log(`MongoDB connecting failed: ${error}`) }) db.once("open", () => { console.log("MongoDB connecting succeeded") }) return db } catch (error) { console.log(`MongoDB connecting failed: ${error}`) } } const mongoInstance = connectMongoDB(config.database.mongo) module.exports = { mongoInstance }
这套连接方法能够满足以下需求,当然,这也是从我的服务需要满足的需求中总结而来的:
开发环境下能够打印详细的数据库操作信息
与数据库断开连接后,所有涉及到数据库读写操作的命令均会立即返回错误,而不会等待重连进而造成接口超时
服务启动并成功与数据库建立连接后,如果数据库出现问题造成连接中断,服务会自动尝试重连直到连接成功
无需手动处理连接数
我们逐条来看每个需求对应的配置:
1.见注释 A,在开发环境中设置 "debug" 为 true,数据库将会把集合方法和参数打印到控制台。
2.见两处注释 B,这里贴一段 mongoose 文档中对 bufferMaxEntries 的解释:
bufferMaxEntries - The MongoDB driver also has its own buffering mechanism that kicks in when the driver is disconnected. Set this option to 0 and set bufferCommands to false on your schemas if you want your database operations to fail immediately when the driver is not connected, as opposed to waiting for reconnection.
核心意思就是将 bufferMaxEntries 设为 0 同时将 bufferCommands 设为 false,可以让驱动在未连接到数据库的时候,操作立即返回失败,而不是一直在等待重连。个人认为,这种方式相比一直等待数据库重连直到响应超时体验要更佳一点。
3.见注释 C,这实际上是 mongoose 的默认设置,其连接数据库时的 config 参数 autoReconnect 默认为 true,其含义见文档:
autoReconnect - The underlying MongoDB driver will automatically try to reconnect when it loses connection to MongoDB. Unless you are an extremely advanced user that wants to manage their own connection pool, do not set this option to false.
如果非高级用户,就不要去改变这个参数了。
4.见注释 D。对于 MongoDB 连接池的问题,建议是不要去手动处理。mongoose 自己会维护一个默认最大数量为 5 的连接池,只有当你发现有一些慢查询可能阻塞快查询时才应该考虑增大 poolSize。当然,这个数字不能设置得过大,MongoDB 默认是一个连接启动一个线程来服务,连接太多线程数切换系统开销会很大。
当然,以上这套『最佳实践』还存在一个不足:如果服务初次启动后未能成功连接数据库(比如数据库此时处于宕机状态),则服务不会尝试重连数据库。解决方法也不是没有,就是比较鸡肋:在 mongoose 连接的 "error" 事件监听回调函数中尝试重连。但是需要设置最大重试次数,否则会发生内存泄露。比较鸡肋的原因是,如果首次连接没有成功,短时间内尝试重连几次貌似也无济于事。因此,使用这套连接方式务必要注意数据库保持可连接状态。或者读者们如果有更好的解决方案,也希望能不吝赐教。
完。
本文首发于我的博客(点此查看),欢迎关注。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/19403.html
摘要:一默认使用的模块化方案,默认是的模块化方案,两者有本质区别。的去寻找引入的依赖时,如果是自带的模块,比如文件模块,只需要填写即可。这是版本入口文件使用了两个路由器路由,分别处理和请求逻辑。核心操作全部依赖模型对象来执行。 一、Node.js默认使用commonJs的模块化方案,TypeScript默认是ES6的模块化方案,两者有本质区别。 1.Node.js的去寻找引入的依赖时,如果...
摘要:一默认使用的模块化方案,默认是的模块化方案,两者有本质区别。的去寻找引入的依赖时,如果是自带的模块,比如文件模块,只需要填写即可。这是版本入口文件使用了两个路由器路由,分别处理和请求逻辑。核心操作全部依赖模型对象来执行。 一、Node.js默认使用commonJs的模块化方案,TypeScript默认是ES6的模块化方案,两者有本质区别。 1.Node.js的去寻找引入的依赖时,如果...
摘要:一默认使用的模块化方案,默认是的模块化方案,两者有本质区别。的去寻找引入的依赖时,如果是自带的模块,比如文件模块,只需要填写即可。这是版本入口文件使用了两个路由器路由,分别处理和请求逻辑。核心操作全部依赖模型对象来执行。 一、Node.js默认使用commonJs的模块化方案,TypeScript默认是ES6的模块化方案,两者有本质区别。 1.Node.js的去寻找引入的依赖时,如果...
摘要:异步最佳实践避免回调地狱前端掘金本文涵盖了处理异步操作的一些工具和技术和异步函数。 Nodejs 连接各种数据库集合例子 - 后端 - 掘金Cassandra Module: cassandra-driver Installation ... 编写 Node.js Rest API 的 10 个最佳实践 - 前端 - 掘金全文共 6953 字,读完需 8 分钟,速读需 2 分钟。翻译自...
摘要:是一种设计用于关系型数据库的查询语言。另一方面,数据库在最近十年变得相当流行。大多数数据库都有驱动程序可以用,它们在上也有库。我们已经完成了在中使用数据库所必须知道的所有基础知识。 本文转载自:众成翻译译者:网络埋伏纪事链接:http://www.zcfy.cc/article/1751原文:https://blog.risingstack.com/node-js-database-t...
阅读 2901·2021-11-25 09:43
阅读 2319·2021-11-24 09:39
阅读 2708·2021-09-23 11:51
阅读 1399·2021-09-07 10:11
阅读 1448·2019-08-27 10:52
阅读 1929·2019-08-26 12:13
阅读 3355·2019-08-26 11:57
阅读 1392·2019-08-26 11:31