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 数据库管理员,超级用户在哪里?