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

设置CONN_MAX_AGE非零后Django仍无法保持PostgreSQL连接的问题

问题排查:为何pg_stat_activity中看不到Django的数据库连接

1. 确认实际触发了数据库请求

确保你的请求确实执行了数据库操作——比如写一个极简视图:

from django.http import HttpResponse
from yourapp.models import YourModel

def test_db(request):
    # 执行明确的数据库查询
    count = YourModel.objects.count()
    return HttpResponse(f"Count: {count}")

访问这个视图后立即执行pg_stat_activity查询,不要等待超过60秒(你的CONN_MAX_AGE设置)。

2. 精准筛选Django的数据库连接

默认pg_stat_activity会显示所有进程,你需要按Django配置的数据库用户筛选,避免遗漏:

SELECT * FROM pg_stat_activity 
WHERE usename = 'your_django_db_user' 
ORDER BY backend_start DESC;

替换your_django_db_user为你settings.py中DATABASES配置里的USER值。

3. 检查Gunicorn worker的配置与状态

  • 若你设置了--max-requests或--max-requests-jitter,worker可能在处理少量请求后重启,导致连接被销毁。可以临时移除这些配置测试。
  • 确认4个Gunicorn worker都在正常运行:执行ps aux | grep gunicorn查看进程列表。

4. 验证数据库连接配置

检查settings.py中的DATABASES配置,确保CONN_MAX_AGE和CONN_HEALTH_CHECKS确实生效:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'your_db_name',
        'USER': 'your_django_db_user',
        'PASSWORD': 'your_db_pass',
        'HOST': 'your_db_host',
        'PORT': '5432',
        'CONN_MAX_AGE': 60,
        'CONN_HEALTH_CHECKS': True,
    }
}

可以在Django shell中验证配置:

from django.conf import settings
print(settings.DATABASES['default']['CONN_MAX_AGE'])  # 应输出60
print(settings.DATABASES['default']['CONN_HEALTH_CHECKS'])  # 应输出True

数据库连接保持的负责主体

每个**Gunicorn工作进程(worker)**独立维护自己的数据库连接,因为Gunicorn的worker是独立的操作系统进程,内存空间相互隔离,无法共享连接池。

在Gunicorn默认的sync worker模式下:

  • 每个worker进程是单线程的,当某个请求触发数据库操作时,Django会为该线程创建一个数据库连接,请求结束后不会立即关闭——而是将连接保存在线程本地存储中,在CONN_MAX_AGE的60秒有效期内,如果该worker接收到新请求,会优先复用这个已有的连接。
  • 连接的维护由Django的数据库连接管理模块负责,和WSGI请求循环绑定:每次请求处理时,Django会检查当前线程是否有可用的持久连接,若有且健康(因为你开了CONN_HEALTH_CHECKS)则复用,否则新建;当连接超过CONN_MAX_AGE时长,或worker进程退出时,连接才会被关闭。

简单来说:不是WSGI循环本身,而是每个Gunicorn worker进程里的线程(sync模式下为1个线程)持有并维护持久连接,Django的连接管理机制在请求生命周期内处理连接的复用与销毁。

内容的提问来源于stack exchange,提问作者Neil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 23:25:28