在nodejs中,每个请求打开mongodb连接并在回调中关闭它是一个好习惯吗?
app.get('/some_route', function(){
MongoClient.connect(url,function(err, db){
//some db query with callback
db.collection("some_collection").findOne(doc, function(err,item){
if(err){
res.send(err);
//close db connection
db.close();
}else{
//do something with item
res.send(item);
//close db connection
db.close();
}
});
});
Run Code Online (Sandbox Code Playgroud)
有些人说没有必要在每个请求上打开/关闭mongodb连接,因为一旦打开,就可以共享一个连接池.
问题是如何维护和共享该池?猫鼬已经自动完成吗?
特别是,在mongodb超时或断开连接时,是否需要重新连接?
我发现这里有矛盾的答案,不管是否请求mongodb连接
几乎所有在线doc node都是mongodb本机驱动程序和我读过的示例代码,db.open()与回调中某处的db.close()配对.
因为如果共享连接池,可能会编码
根据christkv的回答,人们可能会编码:
var p_db=null;
var c_opt = {server:{auto_reconnect:true}};
app.get('/some_route', function(){
//pseudo code
if (!p_db){
MongoClient.connect(url, c_opt, function(err,db){
p_db = db;
p_db.collection("some_collection").findOne(doc, function(err,item){
if(err){
res.send(err);
}else{
//do something with item
res.send(item);
}
});
});
}else {
p_db.collection("some_collection").findOne(doc, function(err,item){
if(err){
res.send(err);
}else{
//do something with item
res.send(item);
}
});
});
Run Code Online (Sandbox Code Playgroud)
小智 5
您无需执行任何重新连接,因为驱动程序将在失败时尝试重新连接.当它等待重新连接发生时,它将缓冲其间发生的所有操作,并在连接启动后重放它们.如果您想自己控制它,您可以监听db实例上的"close"事件并手动处理重新连接.在重新连接时,db对象仍然可行,因为db实际上只是共享连接池的包装器,并且不包含它自己的独立连接逻辑.
| 归档时间: |
|
| 查看次数: |
5570 次 |
| 最近记录: |