You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 17:11:09