连接池和max_connections有什么区别?

时间:2016-08-27 00:45:59

标签: database postgresql sequelize.js amazon-rds

我使用带Sequelize的Postgres作为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
  • 降低池上的空闲超时会更快地帮助免费连接吗?

1 个答案:

答案 0 :(得分:3)

以下查询将帮助您找出有这么多连接的原因

SELECT * FROM pg_stat_activity

一般来说,游泳池与max_connections的关系如何?

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

中获取1个值

max_connections设置为26非常低,我建议您增加设定值。

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

是的,每个连接都需要1次计数。

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

是的,pool max必须始终小于max_connections

降低池上的空闲超时会更快地帮助免费连接吗?

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

可能的原因!!

  1. 有时,可能存在连接泄漏,然后数据库的连接数可能是平时的10倍。
  2. 同样常见的问题是客户端应用程序崩溃并保持连接打开,然后在重新启动时打开新的
  3. 另外,您是否检查了superuser_reserved_connections变量值,请参阅此post,这可能对您有所帮助!!

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

    A bit more detailed explanation here