在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();
}
});
});
有人说,没有必要在每个请求上打开/关闭mongodb连接,因为一旦打开,就可以共享一个连接池。
问题是如何维护和共享该池?猫鼬已经自动做到了吗?
尤其是在mongodb超时或断开连接时,是否需要重新连接?
我在这里发现了相互矛盾的答案:是否根据请求关闭mongodb连接
我读到的几乎所有在线doc nodejs mongodb本机驱动程序和示例代码都是db。open()与db配对。在回调函数中的某个地方关闭()。
因为如果共享连接池,人们可能会编码
根据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实例上的“关闭”事件,并手动处理重新连接。在重新连接时,db对象仍然是可行的,因为db实际上只是共享连接池的包装器,不包含它自己的独立连接逻辑。
根据驱动程序源的主要贡献者的说法,最好在启动时连接到数据库,并为每个请求重复使用相同的连接。
mongodb本机驱动程序有一个内部维护的连接池,目前默认为最多5个打开的连接。您可以通过maxPoolSize
选项配置最大连接数。您还可以使用auto_reconnect
选项将连接配置为自动重新连接。
请参阅此处的文档
我有一个同时进行5次查询的应用程序,我可能需要在所有查询完成之前退出该应用程序,我想知道如何取消我的MongoClient正在进行的所有当前操作并关闭连接。 从我在stackoverflow中读到的另一个问题中,没有必要关闭或处置MongoClient中的连接,因为客户端会自动处理它,因此客户端会在应用程序退出时关闭连接,但客户端会等待这些查询完成后自动关闭还是会立即关闭?如果它等待,我如何让它取
我们正在尝试使用nodejs/mongo原生驱动程序实现下面演示(幻灯片13-18)中概述的策略。 https://www.slideshare.net/mongodb/securing-mongodb-to-serve-an-awsbased-multitenant-securityfanatic-saas-application 总结: 从node.js.创建到mongoDB的连接池 对于租户
在我们正在处理的应用程序中,用户可以通过在文本字段中输入任意的JDBC连接URL来连接到外部RDBMS。我们的一个客户报告说,当他无意中试图连接到带有MySQL JDBC URL的Microsoft SQL server时,我们的应用程序服务器在0%的CPU下冻结(无限期)。 下面的Java片段说明了这种情况: 运行代码段: null 问题: 1)这可能是MariaDB JDBC驱动程序中的一个b
这是我在运行上述程序时遇到的错误。有人解决了这个问题吗? 我尝试过改变Selenium和ChromeDriver的版本,但没有任何效果。
问题内容: 在Go中,当使用SQL数据库时,是否需要在关闭应用程序之前关闭DB()?数据库是否会自动检测到连接已终止? 问题答案: DB将尽其所能进行检测,但是如果没有运气,它可能无法检测到。最好尽快发布所获得的东西。 系统调用将等待TCP连接发送数据,但客户端不会收到任何信息。 发生电源故障,网络问题或裸机退出而没有正确释放资源。TCP keepalive机制将启动,并尝试检测连接已死。 客户端