处理Django请求时PostgreSQL连接随机断开问题求助
Django+PostgreSQL随机连接断开问题求助
近几日,我们的Django网站频繁出现PostgreSQL连接随机断开的情况,会在随机位置抛出InterfaceError: connection already closed错误。触发错误的查询随机出现在不同视图中,无法稳定复现该问题,在执行数据库查询的请求中,错误发生率约为1%-10%。
所有堆栈跟踪模式一致,仅触发错误的查询位置不同,示例堆栈跟踪如下:
InterfaceError: connection already closed File "django/db/backends/base/base.py", line 301, in _cursor return self._prepare_cursor(self.create_cursor(name)) File "django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "django/db/backends/postgresql/base.py", line 269, in create_cursor cursor = self.connection.cursor() InterfaceError: connection already closed File "django/core/handlers/exception.py", line 56, in inner response = get_response(request) File "django/core/handlers/base.py", line 197, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "contextlib.py", line 79, in inner return func(*args, **kwds) File "django/views/generic/base.py", line 103, in view return self.dispatch(request, *args, **kwargs) File "django/contrib/auth/mixins.py", line 73, in dispatch return super().dispatch(request, *args, **kwargs) File "django/views/generic/base.py", line 142, in dispatch return handler(request, *args, **kwargs) File "tolink/views/app.py", line 273, in get self.set_profile(pk) File "tolink/views/app.py", line 267, in set_profile profile = Profile.objects.filter(pk=pk, user=self.request.user).first() File "django/db/models/query.py", line 1047, in first for obj in (self if self.ordered else self.order_by("pk"))[:1]: File "django/db/models/query.py", line 394, in __iter__ self._fetch_all() File "django/db/models/query.py", line 1867, in _fetch_all self._result_cache = list(self._iterable_class(self)) File "django/db/models/query.py", line 87, in __iter__ results = compiler.execute_sql( File "django/db/models/sql/compiler.py", line 1396, in execute_sql cursor = self.connection.cursor() File "django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "django/db/backends/base/base.py", line 323, in cursor return self._cursor() File "django/db/backends/base/base.py", line 300, in _cursor with self.wrap_database_errors: File "django/db/utils.py", line 91, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "django/db/backends/base/base.py", line 301, in _cursor return self._prepare_cursor(self.create_cursor(name)) File "django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "django/db/backends/postgresql/base.py", line 269, in create_cursor cursor = self.connection.cursor()
技术栈配置
- Django 4.1.7
- gunicorn 20.1.0
- psycopg2 2.9.5
- PostgreSQL 14.6
- Heroku基础dyno(部署Django服务)
- 基础版Heroku Postgres(部署PostgreSQL)
数据库相关配置(settings.py)
CONN_HEALTH_CHECKS = True CONN_MAX_AGE = None DATABASES = { "default": dj_database_url.config( conn_max_age=CONN_MAX_AGE, conn_health_checks=True, ssl_require=env("DATABASE_SSL_REQUIRED"), ) } DATABASES["default"]["ATOMIC_REQUESTS"] = True
已查阅Stack Overflow和Django论坛的相关问题,但现有方案多针对nginx+uwsgi栈,不适用于当前环境。当前PostgreSQL连接数限制(2个工作线程,连接上限20)并非问题诱因,且该问题仅出现在生产环境,测试及本地开发无此现象。
目前已尝试更新依赖、重启数据库/服务、调整数据库配置,但问题仍未解决,恳请协助排查。
内容的提问来源于stack exchange,提问作者Lukas Slezevicius
相关产品推荐
相关产品推荐

