使用 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 的连接池的主要内容,如果未能解决你的问题,请参考以下文章