我正在使用Node.js express构建REST API,其中包含使用node-postgres包的postgres数据库。
我的问题是我应该使用客户端还是池?我找到了以下答案:
How can I choose between Client or Pool for node-postgres
但我不明白Pool连接有什么用,因为Nodejs是单线程的,即使有并发请求发生,也不会尝试同时使用单个连接。
此外,通过使用单个连接,我可以更高效地使用预准备语句,我可以在应用的初始化阶段准备它们,然后在请求到达时执行它们。
1条答案
按热度按时间brqmpdu11#
是的,因为Postgresql仍然是多线程的。
当发出一个数据库请求时,你的进程花费0%的CPU时间执行代码。是的,你没看错,零。
计算机不会为了等待而执行代码,而是设置中断处理程序并通知硬件(以太网卡或wifi模块)发送中断时,有数据。无论你的请求你的数据库的数量,你仍然只有一个以太网卡在你的电脑(嗯,有些服务器可以有多个,并通过中继增加了带宽,但我想您可以看到,您拥有的PCI卡数量与您运行的线程数量没有任何关系-更确切地说,它与你愿意花多少钱有关)。你的硬件仍然基本上发送所有的请求一次一位。
因此,传统的多线程服务器等待数据库响应所花费的CPU时间与node.js完全相同:* * 零**。这意味着node.js提高了效率,因为节点只有一个线程,所以不需要为每个线程分配大量RAM。
即使在节点进程所在的计算机上运行数据库,与数据库的通信也不会过于并行。TCP/IP协议栈本身会将通信串行化。虽然它不通过网络硬件,但操作系统仍然使用操作系统级别的事件(而不是硬件中断)来调度响应。
因此,node.js进程与数据库建立多个并行连接是有意义的,即使节点是单线程的--这是为了允许数据库在多个数据库线程中处理请求。您正在利用数据库的多线程,而不是强迫数据库也只使用一个线程来处理节点的单个连接。