我正在第一次进入MEAN堆栈,我正在通过Mongoose使用数据库。我对Mongoose或MongoDB不太熟悉,所以我不知道他们喜欢如何配置。我也不知道Mongoose是否重要,或者这纯粹是一个MongoDB问题。
我最后一次直接编写数据访问逻辑(没有ORM或注入的存储库来处理我的连接管理),它是在.NET中使用System.Data.SqlClient
。我记得必须始终确保SqlConnection
打开不超过必要的时间,并且在我完成时始终明确地关闭它。
我已经阅读了很多关于编写MEAN应用程序的方法,没有人提到这一点。从我看到的代码中,我得到的印象是MongoDB / Mongoose连接喜欢在应用程序级别生活,并且我应该只为整个应用程序调用{{1}}一次。
这是我的连接代码,在应用程序启动时调用一次:
mongoose.connect
JavaScript translation if you need it
这是唯一调用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)
的地方,结果连接对象在整个应用程序中重用。我这样做是对的,还是应该在每次请求时创建,打开,关闭和销毁它?我需要注意哪些其他可伸缩性问题?
我意识到这听起来有点开放,但我希望获得有关MongoDB和Mongoose内部和配置的客观信息。当我在具有大量并发请求的生产环境中执行此操作时是否会出现问题?
答案 0 :(得分:1)
调用mongoose.connect
时创建的内容不是单个连接,而是一个连接池,它应该在应用程序的生命周期中存在,并通过已注册的Mongoose模型由所有代码共享。
所以你已经正确地做了事情,如果你想改变连接池的默认大小(5),你可以通过mongoose.connect
的options参数来做到这一点:
// Use a pool of 3 connections.
mongoose.connect(process.env.MONGO_URI, { server: { poolSize: 3 }});