【问题标题】:What is the difference between connection pooling and max_connections?连接池和 max_connections 有什么区别?
【发布时间】:2017-01-03 17:22:25
【问题描述】:

我使用 Postgres 和 Sequelize 作为 ORM / 查询接口。最近我们开始遇到一些错误:

SequelizeConnectionError: remaining connection slots are reserved for non-replication superuser connections

调查一下,问题似乎与为 Postgres 设置的连接限制有关,但我在弄清楚如何将客户端池设置与 Postgres 设置相关联时遇到了一些麻烦:

在我的 postgres 9.4 数据库(在 Amazon RDS 上)上,我的 max_connections 默认为 26:

SELECT name, setting FROM pg_settings WHERE name='max_connections';
+-----------------+---------+
| name            | setting |
+-----------------+---------+
| max_connections | 26      |
+-----------------+---------+

在 Sequelize 中,我将池设置为:

pool: {
  max: 10,
  min: 0,
  idle: 10000
},

一些问题:

  • 一般来说,池与max_connections 有什么关系?
  • 池中的每个连接是否从max_connections 中取出 1 个计数?
  • 这是否意味着池最大值必须始终小于max_connections
  • 降低池中的空闲超时是否有助于更快地释放连接?

【问题讨论】:

    标签: database postgresql sequelize.js amazon-rds


    【解决方案1】:

    下面的查询将帮助您找出为什么有这么多连接

    SELECT * FROM pg_stat_activity
    

    一般来说,池与 max_connections 有何关系?

    池中的最大值表示您在池中设置的连接数。在 postgresql 中,max_connections 是您在数据库服务器中设置的连接数。因此,池中的每个连接都会从 max_connections 中取出 1 个值

    max_connections设置为26比较低,建议加大设置值。

    池中的每个连接是否从 max_connections 中取出 1 个计数?

    是的,每个连接取出 1 个计数。

    这是否意味着池最大值必须始终小于 max_connections?

    是的,池最大值必须始终小于 max_connections

    降低池中的空闲超时是否有助于更快地释放连接?

    是的,这绝对有帮助,但在这种情况下不是完美的解决方案。

    可能的原因!!

    1. 有时,可能会出现连接泄漏,然后数据库可能会获得比平时多 10 倍的连接。
    2. 另外一个常见问题是客户端应用程序崩溃并保持连接打开,然后在重新启动时打开新连接

    另外,您是否检查了superuser_reserved_connections 变量值,请参阅此post,这可能对您有所帮助!!

    您是否使用 Heroku 进行连接池?

    A bit more detailed explanation here

    【讨论】:

    • 谢谢!这很有帮助。我们没有使用 heroku,我们的应用程序部署在 EC2 上。
    猜你喜欢
    • 2020-11-25
    • 2017-03-13
    • 2023-03-29
    • 2011-09-19
    • 2020-06-15
    • 1970-01-01
    • 2014-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多