在安装了 mongodb v4.0.10 的本地开发机器上,我对 nodejs 应用程序中的一个小集合执行以下十个并发简单请求:
MongoClient.connect('mongodb://localhost/my-db')
.then(async client => {
const db = client.db()
const list = [1, 2, 3, 4, 5, 6, 7, 9, 10]
await Promise.all(
list.map(_ => {
const start = new Date()
return db
.collection('orders')
.find({})
.toArray()
.then(() => {
console.log('passed', new Date() - start)
})
})
)
})
.catch()
结果是
passed 10
passed 2012
passed 2013
passed 4018
passed 4018
passed 4019
passed 6042
passed 6043
passed 6045
我想知道为什么我会得到这样的结果:只有第一个请求非常快,其他请求来得越来越慢?
我认为应该有一些基本问题。MongoDB被配置为具有单个节点(开发机器(的副本集。
该集合只有 3 个元素。 它仅用于测试目的。问题在于并发性,如果这些按顺序发出的请求都需要 10 毫秒<</p>
UPD我发现了什么:
1(如果设置poolSize:1(一(,结果会很好:
passed 12
passed 8
passed 8
passed 15
passed 21
passed 22
passed 22
passed 23
passed 23
2(如果在3.2.4之前使用驱动程序也可以,但是如果要增加旧驱动程序的poolSize
,则第二个查询也会变慢。
您可以尝试在连接配置中增加连接池大小,如下所示:
MongoClient.connect('mongodb://localhost/my-db', { poolSize: 10 }).then( ... )
MongoDB将根据配置的poolSize限制并发请求会话的数量。较高的池大小在对数据库有许多并发请求的良好硬件上可能表现得更好,但是,在具有许多并发请求的平均硬件上,它的性能会差得多。
你现在得到什么输出?