首先,我知道有几个类似的问题,但他们没有回答我的需要,所以让我打开这个新问题:)
其次,这个问题主要集中在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查询非常简单,但是...... idk ......
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()
不执行任何操作(以允许与直接/池化连接相同的api工作)相同的代码,只需更改选项。)
我在这里错过了什么吗?
答案 0 :(得分:0)
只需纠正一点:Node.js在单个线程中运行非阻塞I / O操作,允许它同时处理多个请求(交错) - 因此不需要线程为多个用户提供服务。
我必须承认,汇集的长响应时间似乎很奇怪。但是测试也很简单 - 触发查询并关闭连接。我认为如果测试在释放连接之前做了一些“工作”,它会开始更好地聚集。通常会打开事务,执行多个语句等。您可以在释放连接之前使用一个简单的延迟来模仿它 - 例如2秒。
您可以阅读有关Node服务器如何运行来自单个线程的请求的更多信息,例如"Node.js: 100 new requests while still serving the first one!"
答案 1 :(得分:0)
好的,我认为当你每次请求更快时创建单个连接时出错,因为在执行查询之前只有一个连接要通过网络打开,当你使用池连接做同样的事情时它必须在开始执行查询之前打开100个连接。基本上,它可以在它可以做任何事情之前获得100个连接,因为在单个连接中它必须只获得一个连接。现在,每当请求在您使用池时结束时关闭连接是没有意义的。池化连接的重点是重用连接,这样您就不必每次都进行网络跳跃来打开新连接,以减少延迟并避免每次请求都进行网络握手。