2015-04-05 64 views
0

我正在第一次進入MEAN棧,我正在通過Mongoose處理數據庫。我對Mongoose或MongoDB不是很熟悉,所以我不知道他們是如何配置的。我也不知道Mongoose是否很重要,或者這純粹是一個MongoDB問題。MongoDB/Mongoose中連接的建議使用壽命是多少?

上次我直接編寫數據訪問邏輯(沒有ORM或注入庫來處理連接管理),它在.NET中使用System.Data.SqlClient。我記得一定要確保SqlConnection已經不再需要打開了,並且在我完成時總是明確地關閉它。

我讀過很多關於編寫平均應用程序的方法,沒有人提到這一點。從我見過的代碼中,我得到了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內部和配置的客觀信息。在有大量併發請求的生產環境中執行此操作時是否會出現問題?

回答

1

您在調用mongoose.connect時創建的內容不是單一連接,而是一個連接池,用於存在於應用程序的整個生命週期中,並由所有代碼通過已註冊的Mongoose模型共享。正確

所以,你已經在做的事情,如果你想修改連接池的默認大小(5),你可以做到這一點通過的mongoose.connect選項參數:

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

謝謝!這是否意味着只能有5個同時連接?這對我的測試應用程序來說是足夠的,但對於商業網站而言似乎很低。 – 2015-04-08 14:36:34

+0

@JustinMorgan您可以將'poolSize'值設置爲您需要的任意數量的連接; 5只是默認值。 – JohnnyHK 2015-04-10 01:43:33