使用 pg-promise 的连接池

Posted

技术标签:

【中文标题】使用 pg-promise 的连接池【英文标题】:Connection pool using pg-promise 【发布时间】:2017-09-01 05:06:16 【问题描述】:

我正在使用 Node js 和 Postgresql,并试图在连接实现中最有效。 我看到 pg-promise 建立在 node-postgres 之上,而 node-postgres 使用 pg-pool 来管理池。 我还读到“一次超过 100 个客户是一件非常糟糕的事情”(node-postgres)。

我正在使用 pg-promise 并想知道:

    对于大量数据,推荐的 poolSize 是多少。 如果 poolSize = 100 并且应用程序同时收到 101 个请求(甚至更多),会发生什么? Postgres 是否处理订单并让 101 请求等到它可以运行它?

【问题讨论】:

【参考方案1】:
    如果 poolSize = 100 并且应用程序同时收到 101 个请求(甚至更多),会发生什么? Postgres 是否处理订单并让 101 请求等到它可以运行它?

好的,请求将被排队。但它不是由 Postgres 本身处理的,而是由您的应用程序 (pg-pool) 处理的。因此,每当您用完免费连接时,应用程序将等待连接释放,然后执行下一个待处理的请求。这就是池的用途。

    对于大量数据,推荐的 poolSize 是多少。

这真的取决于很多因素,没有人会真正告诉你确切的数字。为什么不在巨大的负载下测试您的应用,并在实践中查看它的性能,并找出瓶颈。


我还发现node-postgres 文档在这个问题上非常混乱和误导:

一旦您同时收到超过 100 个请求,您的 Web 服务器将尝试打开 100 个与 PostgreSQL 后端的连接,? 您将用完 PostgreSQL 服务器上的内存,您的数据库将变得无响应,您的应用程序似乎会挂起,一切都会破裂。嘘!

https://github.com/brianc/node-postgres

这并不完全正确。如果您达到 Postgres 端的连接限制,则在关闭任何先前的连接之前,您根本无法建立新连接。如果您在节点应用程序中处理这种情况,什么都不会中断。

【讨论】:

您能否解释一下何时发布连接或可用?我不确定这一点。我在使用 AWS Lambda 时遇到了很多超时问题,我不确定如何管理连接池。也许我没有正确释放连接并且我达到了极限。谢谢。 阅读文档,它有很好的例子。至于释放池连接,在pool.query()完成后调用pool.end()。如果您已经这样做了,那么问题可能出在其他地方。【参考方案2】:

我是pg-promise的作者。

我正在使用 Node js 和 Postgresql,并试图在连接实现中最有效。

数据库通信有多个优化级别。其中最重要的是尽量减少每个 HTTP 请求的查询次数,因为 IO 很昂贵,连接池也是如此。

如果您必须对每个 HTTP 请求执行多个查询,请始终通过方法 task 使用任务。 如果您的任务需要事务,请将其作为事务执行,通过方法 tx。 如果您需要进行多次插入或更新,请始终使用多行操作。请参阅Multi-row insert with pg-promise 和PostgreSQL multi-row updates in Node.js。

我看到 pg-promise 构建在 node-postgres 之上,而 node-postgres 使用 pg-pool 来管理池。

node-postgres 从 6.x 版本开始使用 pg-pool,而 pg-promise 保留在使用内部连接池实现的 5.x 版本上。 Here's the reason why.

我还读到“一次超过 100 个客户是一件非常糟糕的事情”

我在这方面的长期实践表明:如果您无法将您的服务放入 20 个连接的池中,那么通过更多的连接将无法挽救您的利益,您将需要修复您的实现。此外,当超过 20 时,您开始对 CPU 施加额外的压力,这会转化为进一步的减速。

对于大量数据,推荐的 poolSize 是多少。

数据的大小与池的大小无关。无论大小,您通常只使用一个连接进行一次下载或上传。除非您的实现是错误的并且您最终使用了多个连接,否则您需要修复它,如果您希望您的应用具有可扩展性。

如果 poolSize = 100 并且应用程序同时收到 101 个请求会发生什么

它将等待下一个可用的连接。


另见:

Chaining Queries Performance Boost

【讨论】:

以上是关于使用 pg-promise 的连接池的主要内容,如果未能解决你的问题,请参考以下文章

WebLogic中查看连接池的使用情况

Alibaba-Druid 连接池使用

Golang 建立TCP时使用连接池

连接池通俗易懂的工作原理

04 | 连接池:别让连接池帮了倒忙

如何查看连接池的使用情况