MongoDB/Mongoose 中连接的推荐生命周期是多少?

What is the recommended lifespan for a connection in MongoDB/Mongoose?

我第一次接触 MEAN 堆栈,我正在通过 Mongoose 使用数据库。我对 Mongoose 或 MongoDB 不是很熟悉,所以我不知道他们喜欢如何配置。我也不知道 Mongoose 是否重要,或者这纯粹是一个 MongoDB 问题。

我上次直接编写数据访问逻辑(没有 ORM 或注入存储库来为我处理连接管理),是在 .NET 中 System.Data.SqlClient。我记得必须始终确保 SqlConnection 打开的时间不超过必要的时间,并在完成后始终明确关闭它。

我已经阅读了很多关于编写 MEAN 应用程序的指南,但没有人提到这一点。从我看到的代码中,我得到的印象是 MongoDB/Mongoose 连接喜欢存在于应用程序级别,并且我应该只为整个应用程序调用一次 mongoose.connect

这是我的连接代码,在应用程序启动时调用一次:

mongoose = require "mongoose" 
connection = mongoose.connection 
mongoose.connect process.env.MONGO_URI

connection.on 'error', (err) ->
    console.error 'DB connection error', err
.once 'open', ->
    console.log 'DB open'

gracefulExit = -> 
    connection.close ->
        console.log 'Mongoose default connection disconnected through app termination'
        process.exit 0

process.on('SIGINT', gracefulExit)
       .on('SIGTERM', gracefulExit)

module.exports = (name, dataStructure) ->
    schema = new Schema dataStructure
    return mongoose.model(name, schema)

JavaScript translation if you need it

这是唯一调用 mongoose.connect 的地方,生成的连接对象在整个应用程序中重复使用。我这样做是对的,还是应该根据每个请求创建、打开、关闭和销毁它?我还需要注意哪些其他可扩展性问题?

我意识到这听起来有点开放,但我希望获得有关 MongoDB 和 Mongoose 内部结构和配置的 objective 信息。在有大量并发请求的生产环境中执行此操作时会出现问题吗?

您在调用 mongoose.connect 时创建的不是单个连接,而是一个连接池,该连接池旨在在您的应用程序的生命周期内存在,并通过您注册的 Mongoose 模型由所有代码共享。

所以你已经做对了,如果你想改变连接池的默认大小 (5),你可以通过 mongoose.connect:[=13= 的选项参数来实现]

// Use a pool of 3 connections.
mongoose.connect(process.env.MONGO_URI, { server: { poolSize: 3 }});