当 Postgresql 连接池耗尽时会发生什么?

What happens when Postgresql Connection Pool is exhausted?

我正在查看从 NodeJs 到 Postgresql 的单池连接。我将使用 pg 库中的 Pool class 以及 async / await.

我读到 Postgresql 默认有 100 个并发连接的限制,Pool 默认有 10 个合并连接。

我的应用程序会在负载很重时扩展新实例,因此理论上我最终可能会拥有 10 个以上的实例,这将超过 100 个 Postgresql 最大连接数。

我想知道的是,在以下情况下执行await pool.Query(....)会发生什么情况

  1. 所有 10 个池连接当前都在使用 - 它会等待一个变为可用还是抛出异常?
  2. 到数据库服务器的所有 100 个连接都在使用中,NodeJS 尝试从池中创建一个新连接。

此外,我如何编写一些 NodeJS 代码来尝试建立 101 个池化连接以证明这种行为?

当达到池中的所有连接时,新的请求者将阻塞直到其他人完成,除非设置了 connectionTimeoutMillis 然后它将在指定的超时后得到一个合成错误。这是documented

当所有 PostgreSQL max_connection 都已耗尽(例如,被多个池耗尽)时,尝试获取连接将失败,并将故障返回到请求者。这似乎没有记录,并且可以想象 Pool 更聪明,例如拦截错误并让客户端等待,好像已经达到该池的最大值(但在那种情况下,如果它是第一个怎么办该池试图建立的连接?它会等待什么?),或定期重试连接以使连接可​​用。

因此,最好不要让这种情况发生,方法是限制应用程序服务器可以扩展的范围或增加 Postgres 中的 max_connections 或降低每个池中的最大值。

其中哪些有意义取决于具体情况。如果瓶颈完全在数据库中,则根本没有必要扩展应用程序服务器。