【问题标题】:What happens when Postgresql Connection Pool is exhausted?当 Postgresql 连接池耗尽时会发生什么?
【发布时间】:2022-01-20 02:49:41
【问题描述】:

我正在研究从 NodeJs 到 Postgresql 的汇集连接。我将使用pg 库中的Pool 类以及async / await

我读到 Postgresql 默认限制为 100 个并发连接,Pool 默认设置为 10 个池连接。

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

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

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

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

【问题讨论】:

  • for (let i=0; i<11; i++) { const p = new Pool(); for (let j=0; j<11; j++) { p.query('SELECT true') } }?

标签: javascript node.js postgresql node-postgres


【解决方案1】:

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

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

因此,建议您不要允许这种情况发生,通过限制应用服务器可以扩展的范围或增加 Postgres 中的 max_connections 或降低每个池中的最大值。

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

【讨论】:

    猜你喜欢
    • 2012-04-17
    • 1970-01-01
    • 2013-06-09
    • 1970-01-01
    • 2017-07-10
    • 2017-03-25
    • 2015-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多