当前位置: 首页 > 面试题库 >

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

杨凯旋
2023-03-14
问题内容

考虑以下是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
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:3526418 < lsn:6624179
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:3646154 < lsn:6624179
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section seq:3705844 < lsn:6624179
Fri Jan 18 11:00:04 [initandlisten] recover skipping application of section more...
Fri Jan 18 11:00:05 [initandlisten] recover cleaning up
Fri Jan 18 11:00:05 [initandlisten] removeJournalFiles
Fri Jan 18 11:00:05 [initandlisten] recover done
Fri Jan 18 11:00:10 [initandlisten] query MYDB.system.namespaces query: { options.temp: { $in: [ true, 1 ] } } ntoreturn:0 ntoskip:0 nscanned:5 keyUpdates:0  nreturned:0 reslen:20 577ms
Fri Jan 18 11:00:10 [initandlisten] waiting for connections on port 27017
Fri Jan 18 11:00:10 [websvr] admin web console waiting for connections on port 28017
Fri Jan 18 11:01:10 [PeriodicTask::Runner] task: WriteBackManager::cleaner took: 32ms
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50076 #1 (1 connection now open)
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50077 #2 (2 connections now open)
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50078 #3 (3 connections now open)
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50079 #4 (4 connections now open)
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50080 #5 (5 connections now open)
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50081 #6 (6 connections now open)
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50082 #7 (7 connections now open)
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50083 #8 (8 connections now open)
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50084 #9 (9 connections now open)
Fri Jan 18 13:36:27 [initandlisten] connection accepted from 192.168.0.1:50085 #10 (10 connections now open)
...........................................
Fri Jan 18 13:36:48 [initandlisten] connection accepted from 192.168.0.1:50092 #97 (97 connections now open)

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

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

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


问题答案:

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

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

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



 类似资料:
  • 问题内容: 通过Node MongoDB本机驱动程序使用Nodejs和MongoDB。需要检索一些文档,并进行修改,然后将其保存回来。这是一个例子: 具有异步性质,如果更新文档的过程花费更长的时间,则当光标到达文档末尾时,数据库连接将关闭。并非所有更新都保存到数据库。 如果省略,则所有文档均正确更新,但应用程序挂起,永不退出。 我看到一则帖子建议使用计数器跟踪更新次数,当回落到零时,然后关闭数据库

  • 这里我的问题是在关闭连接对象时,在以下情况下会出现什么问题。 > 假设没有发生异常,在try块中它会自动关闭连接对象。 如果发生某些异常,它将转到catch块,在那里它将自动关闭连接对象。 关闭finally块中的连接对象。 注意:请不要说最后块中关闭连接对象很好。我知道那个。如果我在try块中保持关闭连接,接球块是否有任何问题请解释。

  • 问题内容: 我一直在花一些时间来学习React,MongoDB和其他与JS Web应用程序相关的工具。对于我创建的一个小型项目,我正在使用此存储库来创建我的玩具应用程序Create no App no build 。在我开发应用程序的过程中,事后我学到了很多与React相关的工具和材料。 我停留的部分是我试图将联系表单的数据提交到MongoDB中,但是到目前为止,我无法将我的应用程序与MongoD

  • 本文向大家介绍Node.js连接mongodb实例代码,包括了Node.js连接mongodb实例代码的使用技巧和注意事项,需要的朋友参考一下 前面介绍了node.js操作mysql以及redis的内容,这里继续学习操作mongodb的内容。 安装驱动 安装命令 安装成功 数据库操作 因为mongodb是文档类型的数据库,与mysql有很大不同,mongodb会自动创建数据库和集合,并不需要提前进

  • 问题内容: 通常,当我打开文件时,我从不调用该方法,也不会发生任何不良情况。但是有人告诉我这是不好的做法。这是为什么? 问题答案: 在大多数情况下,不关闭文件是一个坏主意,原因如下: 它会将您的程序放在垃圾收集器的手中-尽管 理论上 该文件将自动关闭,但可能不会关闭。Python 3和Cpython通常在垃圾收集方面做得相当不错,但并非总是如此,其他变体通常也很烂。 它可能会降低您的程序速度。打开

  • 我试图使java编译类文件,但它抛出了一个错误,如何修复它。