NodeJS mongodb:使用全局连接或本地连接

时间:2015-01-28 06:26:17

标签: node.js mongodb

我有一组nodejs脚本,可以对mongodb进行大量查询,插入和更新。我选择是否使用全局数据库连接对象并将其传递给不同的函数,或者在每个函数中获取自己的数据库连接对象并在完成时关闭它。

  • 全局数据库连接对象。 优势是只需要建立一次连接。通过节省连接到db的时间,后续的函数调用将再次享受性能。 问题是很难确定何时关闭连接。我的脚本很复杂,并且有一些级别的函数调用。即使在触发回调函数之后,某些功能也需要执行更多任务。 在不关闭连接的情况下,父脚本不知道何时退出

  • 在每个单独的函数中建立新的数据库连接对象。这种方法最大的担忧是性能。我测试了每个连接大约需要60ms才能建立。在所有函数调用中添加它可能会导致性能大幅下降。

我倾向于首先接近,但需要找到一种方法,在完成所有任务后退出父脚本。

添加伪代码以说明我的脚本高级结构。

//db is a global connection object. 
function entry_point(db) {
    task1(db, callback){
        loop {
            sub_task(db, callback2){
                dosomething
                callback2
                dosomeotherthings
            }
            callback
        }
        dosomethingagain
    }

    task2(db, callbac) //Similar call trees, maybe with more levels. 
    task3.... 
    ....
}

2 个答案:

答案 0 :(得分:2)

您可以使用async来运行异步作业......最后关闭全局mongodb连接。例如:

async.auto( {
        'mongo': [ function( callback ) {
            /// initiate mongodb and call: callback( null );
        } ],
        'task1': [ 'mongo', function( callback ) {
            // this task wait for 'mongo' to be initiated
            // run your functions/code and call: callback( null );
        } ],
        'task2': [ 'mongo', function( callback ) {
            /// same as task1
        } ],
        'task3': [ 'mongo', 'task1', function( callback ) {
            /// will run after 'mongo' and 'task1' has completed
        } ],
    },
    function( err, rets ) {
        /// all task are done
        /// now you can close your mongodb connection / process.exit( 0 );
    }
);

答案 1 :(得分:2)

正确的方法是在整个应用程序中重复使用全局连接

驱动程序有一个内置连接池(默认大小为5),可以重用现有的集合。

此外,由于HA原因,您的应用程序将连接到具有多个TCP套接字的副本集(或多个mongos)以支持故障转移,并且您可能知道创建新套接字非常昂贵。 (所以你不想"创建新客户")

您可以在此处找到更多信息: