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

Node.js NodeJS mongodb:使用全局连接或本地连接,node.js,mongodb,Node.js,Mongodb,我有一套nodejs脚本,可以对mongodb进行大量查询、插入和更新。我面临的选择是使用全局db连接对象并将其传递给不同的函数,还是在每个函数中获得自己的db连接对象并在完成后关闭它 全局数据库连接对象优点是只需建立一次连接。通过节省连接到db的时间,后续函数调用将再次享受性能问题是很难确定何时关闭连接。我的脚本很复杂,有几个级别的函数调用。即使在触发回调函数之后,某些函数也需要执行进一步的任务。如果不关闭连接,父脚本将不知道何时退出 在每个单独的函数中建立一个新的db连接对象。这种方法最大

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

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

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

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

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

//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.... 
    ....
}
您可以使用来运行异步作业。。。最后关闭全球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)以支持故障转移,您可能知道,创建新套接字的成本相当高。(因此您不想“创建新客户机”)

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


Husanu,谢谢。我之前在探索异步。到目前为止,我看到的示例(包括您的示例)都使用异步来完成一个级别的任务。您是否有在多个级别应用异步的经验?我在我的主要帖子中添加了一些伪代码来说明我的脚本结构。从这里您可以看到,我可能需要在async中应用async。这会是一个问题吗?是否有任何我应该注意的陷阱或高级最佳实践等?谢谢Tug,同意全球连接更好。关于避免“创建新客户机”,您是指创建MongoClient还是打开连接?根据我的测试,创建一个MongoClient对象几乎不需要任何成本,但是打开一个连接是昂贵的。var mongoClient=newmongoclient(新服务器('localhost',27017))//成本1毫秒;open(函数(err,mongoClient){})//成本约为40-50毫秒。