NodeJS mongodb: 使用全局连接或本地连接
NodeJS mongodb: use global connection or local connection
我有一组 nodejs 脚本,可以对 mongodb 进行大量查询、插入和更新。我面临选择是使用全局数据库连接对象并将其传递给不同的函数,还是在每个函数中获取自己的数据库连接对象并在完成后将其关闭。
全局数据库连接对象。 优点是连接只需要建立一次。通过节省连接数据库的时间,后续函数调用将再次享受性能。 问题是很难确定何时关闭连接。我的脚本很复杂并且有几层函数调用。有些函数即使在回调函数被触发后也需要执行进一步的任务。 不关闭连接,父脚本将不知道何时退出。
在每个单独的函数中建立一个新的数据库连接对象。这种方法最大的担忧是性能。我测试了每个连接大约需要 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....
....
}
您可以使用 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")
您可以在此处找到更多信息:
我有一组 nodejs 脚本,可以对 mongodb 进行大量查询、插入和更新。我面临选择是使用全局数据库连接对象并将其传递给不同的函数,还是在每个函数中获取自己的数据库连接对象并在完成后将其关闭。
全局数据库连接对象。 优点是连接只需要建立一次。通过节省连接数据库的时间,后续函数调用将再次享受性能。 问题是很难确定何时关闭连接。我的脚本很复杂并且有几层函数调用。有些函数即使在回调函数被触发后也需要执行进一步的任务。 不关闭连接,父脚本将不知道何时退出。
在每个单独的函数中建立一个新的数据库连接对象。这种方法最大的担忧是性能。我测试了每个连接大约需要 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....
....
}
您可以使用 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")
您可以在此处找到更多信息: