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 }});
我第一次接触 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 }});