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

问题描述 投票:0回答:2

我正在研究从 NodeJs 到 Postgresql 的单池连接。我将使用

Pool
库中的
pg
类以及
async
/
await

我读到 Postgresql 默认情况下有 100 个并发连接的限制,并且

Pool
默认有 10 个池连接。

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

我想知道的是,在以下情况下执行

await pool.Query(....)
会发生什么。

  1. 所有 10 个池连接当前都在使用中 - 是否会等待其中一个可用或引发异常?
  2. 与数据库服务器的所有 100 个连接都在使用中,NodeJS 尝试从池中创建新连接。

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

javascript node.js postgresql node-postgres
2个回答
4
投票

当池中的所有连接都达到时,新的请求者将阻塞,直到其他人完成为止,除非设置了connectionTimeoutMillis,否则它将在指定的超时后收到综合错误。这是记录

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

因此,我们强烈建议您不要允许这种情况发生,方法是限制应用程序服务器的扩展范围或增加 Postgres 中的 max_connections 或降低每个池中的 max_connections。

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


0
投票

我将池大小设置为 1000。 当我通过 pg_stat_acticity 看到总连接数时,它是 40。即便如此,我仍然看到错误连接池已满。为什么会这样?

© www.soinside.com 2019 - 2024. All rights reserved.