首先,我知道有几个类似的问题,但它们没有回答我所需要的内容,所以让我开一个新的问题 :)
其次,这个问题是关注mysql的,但不仅限于它,也适用于其他可池化服务,比如memcached。
据我所知,nodejs单线程执行脚本,但它可以创建线程,因此能够管理服务器中的并发用户。这就是为什么创建连接池是有意义的。
问题在于,当我有一个由express提供的测试API,并执行以下基准代码时:
给我单向连接到数据库的以下输出:
在只有1个连接的mysql池中:
其次,这个问题是关注mysql的,但不仅限于它,也适用于其他可池化服务,比如memcached。
据我所知,nodejs单线程执行脚本,但它可以创建线程,因此能够管理服务器中的并发用户。这就是为什么创建连接池是有意义的。
问题在于,当我有一个由express提供的测试API,并执行以下基准代码时:
ab -t 30 -c 1000 localhost/test
给我单向连接到数据库的以下输出:
Requests per second: 1732.07 [#/sec] (mean)
Time per request: 577.344 [ms] (mean)
在只有1个连接的mysql池中:
Requests per second: 1346.24 [#/sec] (mean)
Time per request: 742.811 [ms] (mean)
使用一个有100个连接的连接池:
Requests per second: 662.82 [#/sec] (mean)
Time per request: 1508.716 [ms] (mean)
这应该是相反的,不是吗?使用池化连接可以获得更好的性能。
我知道池化管理需要时间(但不应该很长),sql查询非常简单,但是...我不知道...
API大概像这样:
function test(response, request, dbc) {
dbc.query(SQL, PARAMS, (err, rows) => {
dbc.release();
if(err) {
log.error('Error while performing the query', err.code);
return;
}
response.send(response, rows);
});
}
在这里,dbc
是单个/池化连接的抽象数据库连接,并且dbc.release()
如果连接不是来自池,则不执行任何操作(允许使用相同的代码在直接/池化连接上工作,只需更改选项)。
我是否漏掉了什么?