Heroku“ psql: FATAL: 剩余的连接插槽是为非复制超级用户连接保留的”

我正在 Heroku 上开发一个应用程序,后端是 Postgreql。在尝试从 CLI 和加载服务器上的页面访问数据库时,我会周期性地收到这个错误消息:

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

有人之前见过这个吗,或者能帮我指出正确的方向吗?

299911 次浏览

您要么需要增加 max_connections配置设置,要么(可能更好)增加 使用连接池,以便通过较小的连接池路由大量用户请求。

Https://wiki.postgresql.org/wiki/number_of_database_connections

我实际上尝试在 django 端实现连接池,使用:

Https://github.com/gmcguire/django-db-pool

但我仍然收到这个错误,尽管可用连接的数量降低到低于标准开发 DB 配额的20个打开连接。

这里有一篇文章介绍如何将 postgreql 数据库迁移到 Amazon RDS 的免费/廉价层。这将允许您将 max_connections设置得更高。这还允许您使用 PGBouncher 在数据库级别共享连接。

Https://www.lewagon.com/blog/how-to-migrate-heroku-postgres-database-to-amazon-rds

更新:

Heroku 回应了我的开票,说我的数据库在他们的网络中负载不平衡。他们说,改进他们的系统应该可以防止今后出现类似的问题。尽管如此,支持手动重新定位了我的数据库,性能也得到了明显的提高。

这个异常发生在我忘记关闭连接时

Heroku“ psql: FATAL: 剩余的连接插槽是为非复制超级用户连接保留的”:

Heroku 有时在数据库负载平衡方面有问题。

André Laszlomarkshiz和我都在评论问题时报告了处理这个问题的情况。

为了省去你的支持电话,以下是我从 Heroku Support 得到的对类似问题的回应:

你好,

业余爱好层数据库的局限性之一是未经宣布的维护。许多业余爱好数据库运行在单个共享服务器上,我们偶尔需要重新启动该服务器以进行硬件维护,或者将数据库迁移到另一台服务器以进行负载平衡。当这种情况发生时,您将在日志中看到一个错误或连接出现问题。如果服务器正在重新启动,则数据库可能需要15分钟或更长时间才能重新联机。

大多数维护连接池的应用程序(如 Rails 中的 ActiveRecord)只能打开到数据库的新连接。然而,在某些情况下,应用程序将无法重新连接。如果发生这种情况,你可以重新启动你的应用程序,让它重新上线。

这是我们建议不要为关键的生产应用程序运行业余爱好数据库的原因之一。标准数据库和 Premium 数据库包括停机事件的通知,通常性能和稳定性都要高得多。您可以使用 pg: copy 迁移到标准或高级计划。

如果继续这样做,您可以尝试使用 heroku addons: add 配置一个新的数据库(在不同的服务器上) ,然后使用 pg: copy 移动数据。请记住,爱好层规则适用于9美元的基本计划以及免费数据库。

谢谢, 布莱德利

要在 Linux 中重现同样的问题:

for i in {1..300}; do
PGPASSWORD=MY_PASSWORD gnome-terminal -e  $'/usr/bin/psql -h \'127.0.0.1\' -p 5432 -U MY_USERNAME'
done

在一个 dotnet 客户端,你可以读到:

  System.InvalidOperationException: An exception has been raised that is likely due to a transient failure.
---> Npgsql.PostgresException (0x80004005): 53300: sorry, too many clients already

在我的案例中,我有很多空闲连接,所以我必须在创建新连接之前重用空闲连接,

错误消息意味着应用程序已经用完了所有可用的连接。

当使用 postgres in aws with knx 和 typecript 执行一些查询和更新工作时,当它完成390个数据库操作时,问题就会弹出,因为一个错误就会阻止正常的 knex.delete ()操作。错误消息是:

(节点号: 66236) UnhandledEconomeRejectionPolice: error: 剩余的连接插槽是为非复制超级用户连接保留的

当 knex.delete ()到达正确的位置时,错误消失了。

.NET世界的背景下,似乎没有问题要问这个问题。

对我来说,这是由 async void引起的,这个方法传递给了一个 Action 委托 Action<TMessage> action,并且有多个线程试图同时调用这个 Perst 方法。

private async void Persist(WhateverData data)
{
await _repository.InsertAsync(data);
}

解决方案是,删除异步并等待,然后同步使用它

private void Persist(PriceInfo price)
{
_repository.InsertAsync().WaitAndUnwrapException();
}

设置 tomcat-jdbc 的最大活动大小,在. properties 或. yml 文件中设置此属性:

MaxActive = 5

或者

Max-active = 5

如下:

春天: 资料来源: 类别: 密码: 网址: 用户名: 最大活跃度: 5