mongodb nodejs本地驱动程序是否closures连接

在nodejs中,每个请求打开mongodb连接并在callback中closures它是一个好习惯吗?

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(); } }); }); 

有人说,每个请求打开/closuresMongoDB连接是不必要的,因为一旦打开,连接池可以共享。

问题是如何维护和共享该池? mongoose已经这样做了吗?

特别是在mongodb超时或断开连接时,是否需要重新连接?

我发现这里矛盾的答案是closures每个请求的MongoDB连接

几乎所有在线文档nodejs mongodb本地驱动程序和示例代码我读,一个db.open()与db.close()在callback中的某处配对。

因为如果一个连接池被共享,你可能会编码 根据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); } }); }); 

由于驱动程序将尝试重新连接失败,因此无需重新进行任何操作。 当它等待重新连接发生时,它将缓冲所有在两者之间发生的操作,并在连接完成时重播它们。 如果你想自己控制这个,你可以监听db实例上的“close”事件并手动处理重新连接。 重新连接数据库对象仍然是可行的,因为数据库实际上只是共享连接池的一个包装,并且不包含它自己单独的连接逻辑。

根据驱动程序源代码的主要贡献者,最好在启动时连接到数据库,并为每个请求重复使用相同的连接。

mongodb本地驱动程序有一个内部维护的连接池,当前缺省为最多5个打开的连接。 您可以通过maxPoolSize选项configuration最大连接数。 您也可以将连接configuration为使用auto_reconnect选项自动重新连接。

请参阅这里的文档