考虑下面是 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

我看到日志(log)文件包含以下数据:

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函数使用相同的底层连接池在不同的db上工作.保留一个池,以确保单个阻塞操作不会冻结 node .js应用程序.如果池中有5个连接,则为默认大小.

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

我也忘了添加.正如另一个答案所指出的,建立一个新的TCP连接在时间和内存方面都很昂贵,这就是为什么要重用连接.此外,一个新的连接也会导致在MongoDB上使用Db上的内存创建一个新线程.

Node.js相关问答推荐

Azure虚拟机上的JS Express:可疑请求?

NodeJS缓冲区大小逻辑:为什么默认是8KB,而不仅仅是数据大小?

如何使用MongoDB在Node.js 中向数组中添加项?

try 使用Express和连接池将数据插入MySQL数据库时出现拒绝访问错误

通过PutObjectCommand上传AWS S3 PDF文件,结果为空PDF

Inno Setup如何在现有文本文件中追加新内容

SvelteKit应用程序立即退出,没有错误

在生产环境中,Nest实例启动时抛出不完整的导入错误

我如何在 Raku 的供应中注册不同的事件?

加速 sequelize ORM 中的查询

WSL2 上需要脚本运行的 NPM 包的权限被拒绝

为什么我的react 表单不能正常工作?

根据 mongoDB 中存在的唯一字符串生成唯一字符串的最佳方法

在多个 .env 文件之间切换,例如 .env.development 和 node.js

编写可维护的事件驱动代码

使用 MongoDB 更新嵌套数组

如何解决'npm应该在 node repl之外运行,在你的普通shell中'

Node.js, require.main === 模块

从 React(同构应用程序)进行 API 调用时出现Access-Control-Allow-Origin问题

deno vs ts-node:有什么区别