2014-01-17 43 views
1

我重構了一些代碼,將我所有的mongoose.createConnection(...)放在一個文件中。這個文件在required的其他文件中使用到指定的各種數據庫的連接。這些連接被延遲創建並用於http服務器和實用程序腳本中。構建貓鼬連接模塊的更好方法

連接文件看起來是這樣的:

var mongoose = require("mongoose"); 
var serverString = "mongodb://localhost:27017"; 
var userDBString = "/USER"; 
var customerDBString = "/CUSTOMER"; 

var userConnection = null; 
exports.getUserConnection = function() { 
    if (userConnection === null) { 
     userConnection = mongoose.createConnection(serverString + userDBString, {server: { poolSize: 4 }}); 
    } 
    return userConnection; 
}; 

var customerConnection = null; 
exports.getCustomerConnection = function() { 
    if (customerConnection === null) { 
     customerConnection = mongoose.createConnection(serverString + customerDBString, { server: { poolSize: 4 }}); 
    } 
    return customerConnection; 
}; 

我的模型存儲在一個單獨的文件(根據其DB),看起來有點像這樣:

exports.UserSchema = UserSchema; //Just assume I know how to define a valid schema 
exports.UserModel = connection.getUserConnection().model("User", UserSchema); 

後來,我用getUserConnection()來引用我創建的連接,以實際執行模型。

TL; DR

在使用這種連接形式的實用程序,我要叫

connection.getUserConnection().on("open", function() { 

    logger.info("Opened User DB"); 
    //Do What I Need To Do 

}); 

這可能是在某些情況下任務處理器將已經播出open事件。在一些情況下,它不能保證發生。我注意到,如果連接未打開(特別是,dropCollection),它不排隊工作,所以我覺得卡住了。

由於在任務處理器運行之前無法依賴預訂打開的事件,我怎麼能確定連接在繼續之前是開放的呢?

是否有更好的模式來集中管理多個連接?

+1

因此,如果您只是使用貓鼬模型與數據庫交互,貓鼬會在內部排隊操作,直到連接建立。是否有一個特定的原因,你不能按預期使用它,並覺得你需要編寫你自己的替代方法? –

+0

我對排隊有同樣的印象 - 我發現它沒有排隊我調用collection.db對象的東西(在我的例子中爲dropCollection)。這可能是唯一的例外,在這種情況下,我可以忍受它,但...我真的想測試連接對象,看它是否是開放的,如果不是,註冊'open'事件監聽器。 –

+0

我可能剛剛回答了我自己的問題。 db打開時connection.readyState === 1嗎? –

回答

0

我可以回答我的問題

的一部分,我怎麼能肯定的是,連接是給定的出發 在開放之前,我可以不依賴於 任務處理器運行之前訂閱的開放活動?

if (connection.getUserConnection().readyState!==1) { 
    logger.info("User connection was not open yet. Adding open listener"); 
    connection.getSR26Connection().on("open", function() { 
     logger.info("User open event received"); 
     doStuff(); 
    }); 
} else { 
    logger.info("User is already open."); 
    doStuff(); 
} 

function doStuff() { 
    logger.info("Doing stuff"); 
} 

如果你看到一個更好的方法,那麼請發表評論或提供了一個答案。我仍然想聽聽其他人如何管理連接,而無需每次重建連接。