我有一组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....
....
}
答案 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)以支持故障转移,并且您可能知道创建新套接字非常昂贵。 (所以你不想"创建新客户")
您可以在此处找到更多信息: