nodejs + mysql:何时使用池化连接?

时间:2016-08-08 11:00:02

标签: mysql node.js connection-pooling

首先,我知道有几个类似的问题,但他们没有回答我的需要,所以让我打开这个新问题:)

其次,这个问题主要集中在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工作)相同的代码,只需更改选项。)

我在这里错过了什么吗?

2 个答案:

答案 0 :(得分:0)

只需纠正一点:Node.js在单个线程中运行非阻塞I / O操作,允许它同时处理多个请求(交错) - 因此不需要线程为多个用户提供服务。

我必须承认,汇集的长响应时间似乎很奇怪。但是测试也很简单 - 触发查询并关闭连接。我认为如果测试在释放连接之前做了一些“工作”,它会开始更好地聚集。通常会打开事务,执行多个语句等。您可以在释放连接之前使用一个简单的延迟来模仿它 - 例如2秒。

您可以阅读有关Node服务器如何运行来自单个线程的请求的更多信息,例如"Node.js: 100 new requests while still serving the first one!"

答案 1 :(得分:0)

好的,我认为当你每次请求更快时创建单个连接时出错,因为在执行查询之前只有一个连接要通过网络打开,当你使用池连接做同样的事情时它必须在开始执行查询之前打开100个连接。基本上,它可以在它可以做任何事情之前获得100个连接,因为在单个连接中它必须只获得一个连接。现在,每当请求在您使用池时结束时关闭连接是没有意义的。池化连接的重点是重用连接,这样您就不必每次都进行网络跳跃来打开新连接,以减少延迟并避免每次请求都进行网络握手。