Heroku的“psql:致命:剩余的连接插槽保留用于非复制超级用户连接”

nx7onnlm  于 2022-11-13  发布在  其他
关注(0)|答案(8)|浏览(368)

我正在Heroku上开发一个带有Postgresql后端的应用程序。当我试图访问数据库时,无论是从CLI还是从服务器上加载页面,都会定期收到以下错误消息:

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

有人见过这个吗?或者请帮我指个方向?

nsc4cvqm

nsc4cvqm1#

您要么需要增加max_connections配置设置,要么(可能更好)使用连接池通过较小的连接池路由大量用户请求。
https://wiki.postgresql.org/wiki/Number_Of_Database_Connections

mctunoxg

mctunoxg2#

当我忘记关闭连接时发生此异常

jecbmhm3

jecbmhm33#

请参阅Heroku “psql: FATAL: remaining connection slots are reserved for non-replication superuser connections”
Heroku有时会在数据库负载平衡方面出现问题。
André Laszlomarkshiz和我都在对该问题的评论中报告了处理该问题的情况。
为了保存您的支持电话,以下是我从Heroku支持部门收到的类似问题的回复:
您好,我是
业余爱好层数据库的限制之一是未经通知的维护。许多业余爱好数据库在单个共享服务器上运行,我们有时需要重新启动该服务器以进行硬件维护,或将数据库迁移到另一个服务器以实现负载平衡。当发生这种情况时,您将在日志中看到错误或出现连接问题。如果服务器正在重新启动,数据库可能需要15分钟或更长时间才能恢复联机。
大多数维护连接池的应用程序(如Rails中的ActiveRecord)只能打开一个新的数据库连接。但是,在某些情况下,应用程序将无法重新连接。如果发生这种情况,您可以使用heroku重新启动您的应用程序,使其重新联机。
这也是我们不建议在关键生产应用程序中运行业余数据库的原因之一。标准和高级数据库包含停机事件通知,通常性能和稳定性更高。您可以使用pg:copy迁移到标准或高级计划。
如果这种情况继续下去,你可以尝试使用heroku addons:add在不同的服务器上设置一个新的数据库,然后使用pg:copy来移动数据。请记住,业余爱好层规则适用于9美元的基本计划以及免费数据库。
谢了布拉德利

rqcrx0a6

rqcrx0a64#

我实际上尝试在django端使用以下代码实现连接池:
https://github.com/gmcguire/django-db-pool
但是我仍然收到了这个错误,尽管我将可用的连接数降低到低于标准开发DB配额20个打开的连接。
这里有一篇文章介绍了如何将postgresql数据库移到Amazon RDS的免费/廉价层。这将允许您将max_connections设置得更高。这也将允许您使用PGBouncer在数据库级别池化连接。
https://www.lewagon.com/blog/how-to-migrate-heroku-postgres-database-to-amazon-rds

更新日期:

Heroku回复我的未结罚单,并指出我的数据库在他们的网络中负载平衡不正确。他们说,改进他们的系统应该可以防止将来出现类似问题。尽管如此,支持人员手动重新定位了我的数据库,性能得到了明显改善。

ffscu2ro

ffscu2ro5#

要在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
js4nwp54

js4nwp546#

在我的例子中有很多空闲连接,因此在创建新连接之前必须重用空闲连接,

wgeznvg7

wgeznvg77#

错误消息表示应用程序已用完所有可用连接。
在aws中使用postgres和knex、typescript进行查询和更新时,当它完成390个数据库操作时会弹出这个问题,因为一个错误阻止了正常的knex.destroy()操作。错误消息是:
(node:66236)未处理的承诺拒绝警告:错误:剩余的连接插槽是为非复制超级用户连接保留的
当knex.destroy()到达正确的位置时,错误就消失了。

7rfyedvj

7rfyedvj8#

在**.NET**环境中,似乎没有人会问这个问题。
对我来说,这是由async void引起的,这个方法传递给了一个Action委托Action<TMessage> action,并且有多个线程试图同时调用这个Persists方法。

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

解决方案是,删除async和await,只同步使用它

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

相关问题