Django Postgresql Heroku:操作错误-'角色“用户名”的连接太多'

Posted

技术标签:

【中文标题】Django Postgresql Heroku:操作错误-\'角色“用户名”的连接太多\'【英文标题】:Django Postgresql Heroku : Operational Error - 'FATAL too many connections for role "usename"'Django Postgresql Heroku:操作错误-'角色“用户名”的连接太多' 【发布时间】:2018-07-16 14:04:29 【问题描述】:

我在 Heroku 上使用 Django 和 Django Rest Framework 以及 postgresql 和 redis 数据存储运行 Web 应用程序。我使用的是限制为 20 个连接的免费 postgresql 层。

这在过去不是问题,但最近我开始使用 django channels 2.0 和 daphne server(将我的 Procfile 从 gunicorn 切换到像 this tutorial 这样的 daphne),现在我遇到了各种各样的问题奇怪的问题。

最关键的是与数据库的连接保持打开状态,因此当应用程序运行时,连接数不断增加,直到达到 20 并给我以下错误消息:操作错误 - 'FATAL too many connections for role “用户名”'

然后我每次都必须手动进入 shell 并输入heroku pg:killall,这显然不是一个可行的解决方案,而且这是生产,所以我的用户无法访问站点并得到 500 个错误。非常感谢任何帮助。

我试过了:

将此添加到我在不同地方的不同视图中

from django.db import connections conections.close_all()

for con in connections: con.close()

我也尝试过SELECT * from pg_activity,看到了一堆东西,但不知道该怎么做:

【问题讨论】:

【参考方案1】:

我们找出了问题所在。我假设您正在使用 dj_database_url 就像在 heroku 手册中一样。您所要做的就是删除 conn_max_age。

db_from_env = dj_database_url.config()

【讨论】:

【参考方案2】:

有解决办法:

现在 heroku 提供 django_heroku 包来处理默认的 django-heroku 应用程序配置,所以当你在 settings.py 的末尾调用 django_heroku.config(locals()) 时,默认的 CONN_MAX_AGE 数据库配置设置为 600 秒,所以django的默认值是0,这意味着请求完成后所有数据库连接都被关闭,如果你在调用django_heroku.config(locals())后不替换CONN_MAX_AGE的值,这个字段的值默认为600是什么意思数据库连接仍然存在 600 秒导致此问题。

将此行放在 settings.py 的末尾,它必须在 heroku 配置之后:

django_heroku.config(locals())
DATABASES['default']['CONN_MAX_AGE'] = 0

【讨论】:

我尝试了您的解决方案,但在询问新连接之前,我仍然需要等待默认的 600 秒。 @RobZ 确保您在 settings.py 末尾调用 DATABASES['default']['CONN_MAX_AGE'] = 0 并将您的应用重新部署到 heroku。 经过更多研究后,导致问题的原因是我在任务/工作人员中执行的一些自定义线程。在维护的线程连接内。线程外DATABASES['default']['CONN_MAX_AGE'] = 0 按预期工作,使用后立即断开连接。【参考方案3】:

我想我可能已经解决了。

我所做的更改之一是修改关闭连接的方式。

关键是在各种视图功能前后关闭旧连接。

from django.db import close_old_connections

@csrf_exempt
@api_view(['GET', ])
def search(request):
    close_old_connections()
    # do stuff
    close_old_connections()

【讨论】:

您可以使用django debug toolbar 之类的工具来查看哪些视图拥有最多的SQL 连接。或者您可以尝试根据您对应用程序工作原理的理解来推断,哪些视图具有最多的数据库调用。s

以上是关于Django Postgresql Heroku:操作错误-'角色“用户名”的连接太多'的主要内容,如果未能解决你的问题,请参考以下文章

错误:无法从“10.3”确定 PostgreSQL 版本 - Heroku 上的 Django

使用 Heroku 在 Django 中为本地开发配置 postgresql 数据库

Heroku 上带有 Postgresql 的 Django - settings.DATABASES 配置不正确。请提供名称值

Heroku Django Postgresql 数据库管理员,超级用户在哪里?

Django Postgresql Heroku:操作错误-'角色“用户名”的连接太多'

Django:从本地开发推送时,SQLite 在 Heroku 上覆盖 POSTGRESQL db