Django / Heroku:致命:角色连接过多 [英] Django/Heroku: FATAL: too many connections for role

查看:83
本文介绍了Django / Heroku:致命:角色连接过多的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

因此,我刚刚通过Heroku(业余爱好)和Postgres(试用版)启动了一个包含Channels 2.0 Daphne 2.2.0和asgi的网站。当我启动我的网站时,我四处点击了几页,出现500错误。我收到的错误消息是 FATAL:角色的连接过多... c

So I just launched a website with Channels 2.0 Daphne 2.2.0 and asgi via Heroku (Hobby) and Postgres (trial). When I launch my website, I click around for a few pages and I get a 500 error. The error message I get emailed is FATAL: too many connections for role ..."

当我运行 heroku pg:killall 或等待足够长的时间,我可以单击几下直到错误消息再次出现。但是,当我运行 heroku pg 显示 Connections 0/20 。有人知道这是怎么回事,我该如何阻止错误发生?我可能打开了两个连接

When I run heroku pg:killall or wait long enough I can click around a few more times until the error message repeats itself. However, when I run heroku pg it shows Connections 0/20. Does anyone know what is going on and how I can stop the errors? It's possible that I have two many connections open for a second, but it doesn't seem that way.

File "/app/.heroku/python/lib/python3.6/site-

packages/django/contrib/sessions/backends/base.py" in _get_session
  191.             return self._session_cache

During handling of the above exception ('SessionStore' object has no attribute '_session_cache'), another exception occurred:

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py" in ensure_connection
  216.                 self.connect()

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py" in connect
  194.         self.connection = self.get_new_connection(conn_params)

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/postgresql/base.py" in get_new_connection
  168.         connection = Database.connect(**conn_params)

File "/app/.heroku/python/lib/python3.6/site-packages/psycopg2/__init__.py" in connect
  130.     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)

The above exception (FATAL:  too many connections for role "polewdwynmvyyt"
) was the direct cause of the following exception:

File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  35.             response = get_response(request)

File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "/app/.heroku/python/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "./myproject/views.py" in home_page
  8.     print(request.session.get("first_name","Unknown")) #getter

File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/sessions/backends/base.py" in get
  66.         return self._session.get(key, default)

File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/sessions/backends/base.py" in _get_session
  196.                 self._session_cache = self.load()

File "/app/.heroku/python/lib/python3.6/site-packages/django/contrib/sessions/backends/db.py" in load
  34.                 expire_date__gt=timezone.now()

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/manager.py" in manager_method
  82.                 return getattr(self.get_queryset(), name)(*args, **kwargs)

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.py" in get
  397.         num = len(clone)

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.py" in __len__
  254.         self._fetch_all()

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.py" in _fetch_all
  1179.             self._result_cache = list(self._iterable_class(self))

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/query.py" in __iter__
  53.         results = compiler.execute_sql(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size)

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/models/sql/compiler.py" in execute_sql
  1066.             cursor = self.connection.cursor()

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py" in cursor
  255.         return self._cursor()

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py" in _cursor
  232.         self.ensure_connection()

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py" in ensure_connection
  216.                 self.connect()

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/utils.py" in __exit__
  89.                 raise dj_exc_value.with_traceback(traceback) from exc_value

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py" in ensure_connection
  216.                 self.connect()

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/base/base.py" in connect
  194.         self.connection = self.get_new_connection(conn_params)

File "/app/.heroku/python/lib/python3.6/site-packages/django/db/backends/postgresql/base.py" in get_new_connection
  168.         connection = Database.connect(**conn_params)

File "/app/.heroku/python/lib/python3.6/site-packages/psycopg2/__init__.py" in connect
  130.     conn = _connect(dsn, connection_factory=connection_factory, **kwasync)


推荐答案

似乎连接没有被重用和/或为每个请求创建一个新线程。

Seems like the connections are not being reused and/or a new thread is being created for each request.

dj_database_url.config中删除 CONN_MAX_AGE (默认= DATABASE_URL) settings.py 上(如果您使用的是dj_database_url)。

Remove the CONN_MAX_AGE from dj_database_url.config(default=DATABASE_URL) on settings.py (if you are using dj_database_url).

将环境变量 ASGI_THREADS 设置为小于您的 .asgi 文件或heroku网站->设置-> configVars。
如果使用daphne,则默认线程为CPU内核* 5,每个线程都有一个连接。

Set the environment variable ASGI_THREADS to a number of threads lower than your connections limit on your .asgi file or on heroku site -> settings -> configVars. If you are using daphne, the default threads are CPU cores * 5, each thread with a connection.

example.asgi文件:

example.asgi file:

import os
import django
from channels.routing import get_default_application

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "yourAppName.settings")
os.environ['ASGI_THREADS']="4"
django.setup()
application = get_default_application()

这篇关于Django / Heroku:致命:角色连接过多的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆