我在Heroku上使用Django和Django Rest Framework运行一个带有postgresql和redis数据存储的Web应用程序。我在免费的postgresql层,限制为20个连接。
这在过去并不是一个问题,但最近我开始使用django channels 2. 0和daphne server(将我的Procfile从gunicorn切换到daphne,如this tutorial),现在我已经遇到各种奇怪的问题。
最关键的是与数据库的连接保持打开状态,以便在应用程序运行时,连接数量不断增加,直到达到20并且给出以下错误消息:操作错误 - 'FATAL连接角色太多“USENAME”'
然后我必须手动转到shell并每次输入heroku pg:killall
,这显然不是一个可行的解决方案,这是生产所以我的用户无法访问网站并获得500错误。真的很感激任何帮助。
我试过了:
将此添加到我在不同地方的不同视图
from django.db import connections
conections.close_all()
for con in connections:
con.close()
我也尝试过做SELECT * from pg_activity
并看到一堆东西,但不知道该怎么做:
答案 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 秒导致此问题。
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()