Node.js NodeJS mongodb:使用全局连接或本地连接
我有一套nodejs脚本,可以对mongodb进行大量查询、插入和更新。我面临的选择是使用全局db连接对象并将其传递给不同的函数,还是在每个函数中获得自己的db连接对象并在完成后关闭它Node.js NodeJS mongodb:使用全局连接或本地连接,node.js,mongodb,Node.js,Mongodb,我有一套nodejs脚本,可以对mongodb进行大量查询、插入和更新。我面临的选择是使用全局db连接对象并将其传递给不同的函数,还是在每个函数中获得自己的db连接对象并在完成后关闭它 全局数据库连接对象优点是只需建立一次连接。通过节省连接到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)以支持故障转移,您可能知道,创建新套接字的成本相当高。(因此您不想“创建新客户机”) 您可以在此处找到更多信息: