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

NodeJS mongodb: use global connection or local connection

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

我倾向于第一种方法,但需要找出一种方法让父脚本在完成所有任务后退出。

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

//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.... 
    ....
}

您可以使用 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 );
    }
);

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

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

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

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