Django Postgresql Heroku:操作错误 - 'FATAL太多连接角色“usename”'

时间:2018-02-06 13:27:54

标签: django postgresql heroku django-rest-framework django-channels

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

这在过去并不是一个问题,但最近我开始使用django channels 2. 0和daphne server(将我的Procfile从gunicorn切换到daphne,如this tutorial),现在我已经遇到各种奇怪的问题。

最关键的是与数据库的连接保持打开状态,以便在应用程序运行时,连接数量不断增加,直到达到20并且给出以下错误消息:操作错误 - 'FATAL连接角色太多“USENAME”'

Sentry Error Description

postgresql connection utilization 然后我必须手动转到shell并每次输入heroku pg:killall,这显然不是一个可行的解决方案,这是生产所以我的用户无法访问网站并获得500错误。真的很感激任何帮助。

我试过了:

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

from django.db import connections conections.close_all()

for con in connections: con.close()

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

Heroku Dataclip pg_activity

3 个答案:

答案 0 :(得分:2)

我们弄清楚了问题是什么。我假设你在heroku手册中使用dj_database_url。您所要做的就是删除conn_max_age。

db_from_env = dj_database_url.config()

答案 1 :(得分:1)

有解决办法:

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

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

600

答案 2 :(得分:0)

我想我可能已经解决了。

我所做的一项改变是修改我关闭连接的方式。

关键是在各种视图函数之前和之后关闭旧连接。

from django.db import close_old_connections

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