专业的SQL Server、MySQL数据库同步软件

连接池的作用主要是减少每个临时连接建立所引起的开销。乍一看,nodejs在单个线程上运行。它不能同时使用多个连接。乍一看,它不需要连接池。但这只是我们最初的潜意识。让我们对其进行详细分析,看看该结论是否正确。

先从简单的redis开始。

Redis服务器也运行在单个线程上。两者都是单线程的,并且似乎更加确定不需要连接池。从详细的图像中,让我们看一下nodejs是否将redis与连接池连接起来。

node如何使用redis nodejs redis连接池_mysql

在上图中,nodejs总共有两个连接,并将查询请求分别发送到redis服务器。因为redis是单线程作业,所以无论是通过一个连接发送多个查询任务还是通过多个连接发送两个查询任务,无论任务是一个接一个地串行发送还是以并行方式发送到服务器,redis都按顺序一个接一个地执行并通过当前连接(这里是nodejs)返回给客户端。在nodejs收到redis返回后,它就无法控制并行或非并行,它必须等待其nodejs的主线程来一对一地处理服务器返回的数据。

因此,根据以上结论,nodejs + redis只需要共享一个连接,因此不需要使用连接池。

如上图所示,mysql将为每个要查询的连接创建一个单独的线程。与redis数据基本上不在内存中不同,因为mysql将有很多IO操作来读取磁盘,所以多个线程一起工作将比一个查询快。

但是nodejs是单线程的,它可以同时向mysql服务器发送多个请求吗?

在这里,我们需要了解nodejs的操作。尽管nodejs是主线程,但它调用的IO指令是由另一个线程完成的。 IO指令完成后,将一个小的任务分配给主线程,即回调函数Too。

这里的关键点是有一个主要的nodejs线程,但是会有多个IO线程。

因此,如果仅通过单个连接使用nodejs + mysql,则无法利用mysql可以同时服务多个查询的优势。您应该使用类似于以下所示的方法。 Nodejs使用多个连接来连接到mysql。多连接需要连接池。拥有连接池可避免创建和销毁每个连接的成本。

因此,我们的第一步是认为Node.js是单线程的,而不是需要连接池。使用连接池不仅是客户端,而且使用数据库服务器都是错误的。只有充分了解整个系统的运行方式,我们才能得出结论。了解服务器的操作模式,是否有阻塞操作,是否为多线程等。我认为将redis设计为单线程的主要原因是其数据基本上在内存中,并且该过程查询数据的数量绝不会导致阻塞进程,并且CPU不会处于空闲状态。

全局连接断开和重新连接问题

还没有结束。基于以上分析,nodejs + mysql使用线程池没有问题。Nodejs + redis只需要一个连接。但是,仍然建议需要连接池为了说明这个问题,我们必须从代码开始,我们以node-redis包为例。

例如,一个新的db.js

在程序启动并加载后,将连接上述连接。在使用它来使用全局唯一连接时进行介绍。

这里有一个问题。

但是,这里全局上只有一个连接,并且在程序启动时会创建此连接。它与运行时在连接池中动态创建连接不同。如果在某个时候唯一的连接断开,则程序将不会动态创建连接,需要重新启动服务器。

看起来很糟糕,但是幸运的是这个问题不存在。由于redis客户端将自动重新连接,因此无需重新启动服务器。

但是,由于连接在短时间内断开,因此应用程序服务器通常无法提供外部服务,但是连接的自动重新连接需要一定的时间间隔。例如,在一秒钟后,系统在这一秒钟内处于不可维护状态。

正是由于上述原因,因此存在使用连接池连接redis的实践。如果连接池用于管理,请在连接不可用时立即手动创建新连接。与自动重新连接相比,一种方法是立即手动重新连接,另一种是等到一定间隔后重新连接。相对而言,手动重新连接的时间较短,这意味着可以将无法在1秒内进行维修的系统状态缩短为0.5秒。因此,存在使用连接池管理Redis连接的实践。严格来说,这不能被视为连接池,而是连接管理模块。

这里的最终结论是,nodejs + mysql最好使用连接池,nodejs + redis是否可以使用。