首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当节点是单线程时,为什么我们需要node.js中的连接池?

当节点是单线程时,为什么我们需要node.js中的连接池?
EN

Stack Overflow用户
提问于 2017-07-07 15:12:04
回答 2查看 4.6K关注 0票数 10

Node.js是单线程的。Javascript V8引擎和一些内部库是多线程的。对于I/O,节点将I/O委托给可能是多线程的操作系统。

如果我的node.js应用程序正在连接到redis或,sql/mariadb服务器,我假设我不需要一个用于redis或mysql的连接池。

作为一名开发人员,我创建了1个redis或mysql连接,并将其重用以发送/获取数据。当数据到达时,节点将调用回调来处理数据。

我理解使用Java/.NET的连接池,但它们是多线程的,因此Java/.NET中的连接池有明显的好处。

我的问题是:当节点是单线程时,为什么我们需要node.js中的连接池?有什么好处吗?节点不会利用底层操作系统和javascript引擎的多线程特性,而不需要开发人员这样做吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-07 15:38:17

节点运行您的代码单线程。但是,Node.js实际上有一个您的代码无法访问的线程池。线程机制是用利布夫实现的。看一看利布夫书的深度,并解释了libuv的内部工作原理。

基本上,您的代码在事件循环(单线程)的上下文中运行。然后将任何异步工作从池中卸载到可用的线程,事件循环将只轮询,直到其中一个线程完成该异步工作为止。完成之后,异步调用注册的回调函数将被调用,并将在事件循环的下一个I/O Callback Phase中工作。您可以阅读更多关于事件循环及其在Node.js 文档中的阶段的信息。

用这种事件循环风格构建应用程序的好处之一是关键部分编码(互斥、信号量等)的抽象。这通常与多线程应用程序相关联。

票数 3
EN

Stack Overflow用户

发布于 2017-07-07 15:52:28

您需要连接池,因为即使一个线程也可以容纳多个“阻塞”DB连接(假设这里是RDBMS )。如果没有连接池,您的应用程序将为每个附加DB请求从头创建每个连接,即使是在一个异步/非阻塞系统(如Node )中。

示例:

代码语言:javascript
复制
request 1 - insert user  -- wait for response (assume it's 5 secs)
request 2 - insert invoice - wait for response (assume it's 3 secs)
request 3 - insert another invoice

请注意,请求3将立即处理,而无需等待请求1和2的完成。在这个单线程中,我们已经使用了三个资源连接到DB。想象一下,每次需要DB操作时都要创建每个数据库。从连接池中抓取一个要快得多!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44974210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档