我正在研究从 NodeJs 到 Postgresql 的单池连接。我将使用
Pool
库中的 pg
类以及 async
/ await
。
我读到 Postgresql 默认情况下有 100 个并发连接的限制,并且
Pool
默认有 10 个池连接。
我的应用程序会在负载较重时扩展新实例,因此理论上我最终可能会拥有超过 10 个实例,这将超过 100 个 Postgresql 最大连接数。
我想知道的是,在以下情况下执行
await pool.Query(....)
会发生什么。
另外,我如何编写一些 NodeJS 代码来尝试建立 101 个池连接以证明这种行为?
当池中的所有连接都达到时,新的请求者将阻塞,直到其他人完成为止,除非设置了connectionTimeoutMillis,否则它将在指定的超时后收到综合错误。这是记录
当所有 PostgreSQL max_connection 都耗尽时(例如,通过多个池),尝试获取连接将失败,并将故障回复给请求者。这似乎没有记录,人们可以想象池更聪明,例如拦截错误并让客户端等待,就好像已经达到该池的最大值一样(但在这种情况下,如果它是第一个呢?该池尝试建立的连接?它将等待什么?),或者定期重试连接以使连接变得可用。
因此,我们强烈建议您不要允许这种情况发生,方法是限制应用程序服务器的扩展范围或增加 Postgres 中的 max_connections 或降低每个池中的 max_connections。
其中哪一个有意义取决于具体情况。如果瓶颈完全在数据库中,那么扩展应用程序服务器根本没有意义。
我将池大小设置为 1000。 当我通过 pg_stat_acticity 看到总连接数时,它是 40。即便如此,我仍然看到错误连接池已满。为什么会这样?