为了账号安全,请及时绑定邮箱和手机立即绑定

为什么建议不要在Node.js代码中的任何地方关闭MongoDB连接?

/ 猿问

为什么建议不要在Node.js代码中的任何地方关闭MongoDB连接?

绝地无双 2019-11-14 14:48:08

考虑以下是Node.js代码:


function My_function1(_params) {

    db.once('open', function (err){

     //Do some task 1

});

}


function My_function2(_params) {

    db.once('open', function (err){

     //Do some task 2

});

}

请参阅链接以获取最佳实践,该实践表明不要关闭任何连接


https://groups.google.com/forum/#!topic/node-mongodb-native/5cPt84TUsVg


我已经看到日志文件包含以下数据:


Fri Jan 18 11:00:03 Trying to start Windows service 'MongoDB'

Fri Jan 18 11:00:03 Service running

Fri Jan 18 11:00:03 [initandlisten] MongoDB starting : pid=1592 port=27017 dbpath=\data\db\ 64-bit host=AMOL-KULKARNI

Fri Jan 18 11:00:03 [initandlisten] db version v2.2.1, pdfile version 4.5

Fri Jan 18 11:00:03 [initandlisten] git version: d6...e0685521b8bc7b98fd1fab8cfeb5ae

Fri Jan 18 11:00:03 [initandlisten] build info: windows sys.getwindowsversion(major=6, minor=1, build=7601, platform=2, service_pack='Service Pack 1') BOOST_LIB_VERSION=1_49

Fri Jan 18 11:00:03 [initandlisten] options: { config: "c:\mongodb\mongod.cfg", logpath: "c:\mongodb\log\mongo.log", service: true }

Fri Jan 18 11:00:03 [initandlisten] journal dir=/data/db/journal

Fri Jan 18 11:00:03 [initandlisten] recover begin

Fri Jan 18 11:00:04 [initandlisten] recover lsn: 6624179

Fri Jan 18 11:00:04 [initandlisten] recover /data/db/journal/j._0

Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:59343 < lsn:6624179

Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:118828 < lsn:6624179

Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:238138 < lsn:6624179

Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:835658 < lsn:6624179

Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:955218 < lsn:6624179

Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:3467218 < lsn:6624179

通过打开多个连接而不是关闭多个连接,这是否在服务器上造成了开销?它是否在内部处理连接池?


但是在MongoDB Docs中提到“这是不使用请求池的应用程序的正常行为”


有人可以帮助我理解这一点吗?


查看完整描述

3 回答

?
慕容708150

您只需使用MongoClient打开一次Db连接,然后在您的应用程序中重复使用它。如果需要使用多个数据库,则可以在Db对象上使用.db函数,以使用相同的基础连接池在不同的数据库上工作。保留一个池以确保单个阻止操作不会冻结您的node.js应用程序。如果池中有5个连接,则为默认大小。


http://mongodb.github.com/node-mongodb-native/driver-articles/mongoclient.html


我也忘了补充。正如另一个答案指出的那样,建立新的TCP连接在时间和内存上都是昂贵的,这就是您重新使用连接的原因。同样,新的连接也将导致使用Db上的内存在MongoDB上创建新的线程。


查看完整回答
反对 回复 2019-11-14
?
富国沪深

MongoDB将数据库连接池化以提高效率,因此在mongodb.log中打开许多连接并不罕见


但是,当应用程序完全关闭时,关闭所有连接很有用。此代码是执行此操作的最佳选择。


process.on('SIGINT', function() {

  mongoose.connection.close(function () {

    console.log('Mongoose disconnected on app termination');

    process.exit(0);

  });

});


查看完整回答
反对 回复 2019-11-14
?
慕婉清6462132

我不是node.js专家,但是我认为大多数语言之间的原因相对相同。


建立连接是:


驾驶员要做的最重的事情之一。即使在快速的网络上,也可能需要数百毫秒才能正确建立连接。


(http://php.net/manual/zh/mongo.connecting.pools.php)


只要是针对PHP和doc的文件,该文件即使在现在以及大多数(如果不是全部)驱动程序中仍然适用,仍然有些过时。


每个连接也可以使用单独的线程,这会导致明显的开销。


似乎来自:


http://mongodb.github.com/node-mongodb-native/driver-articles/mongoclient.html#the-url-connection-format


该node.js仍使用连接池来尝试停止建立连接的开销。当然,这不再适用于其他驱动程序,例如PHP。


它打开x了5到数据库服务器的连接数量(默认为),并在需要数据时将工作转移到空闲连接,因此重用旧连接避免了此讨厌的过程,该过程可能导致这些日志:http : //docs.mongodb.org/manual / faq / developers /#why-does-mongodb-log-so-many-connection-accepted-events并增加连接开销。


分享编辑


查看完整回答
反对 回复 2019-11-14

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信