Django每次执行SQL查询都触发新数据库登录,如何配置持久连接复用会话?
Django 数据库频繁新建连接问题修复方案
核心原因
Django 默认数据库连接的生命周期为单次请求,由配置项 CONN_MAX_AGE 控制,默认值为 0,即每次请求执行完成后立即销毁连接,因此每10秒一次的查询会对应产生一次新的数据库登录行为。
修复配置
在 settings.py 的数据库配置块中新增 CONN_MAX_AGE 参数即可启用连接持久化复用,单位为秒,示例配置如下:
DATABASES = { "default": { # 保留原有配置:ENGINE/NAME/USER/PASSWORD/HOST/PORT 均无需修改 "ENGINE": "django.db.backends.mysql", "NAME": "your_db_name", "USER": "your_db_user", "PASSWORD": "your_db_password", "HOST": "127.0.0.1", "PORT": "3306", # 新增以下配置,设置连接最大存活时间,可根据业务场景调整 "CONN_MAX_AGE": 600, # 示例设置为10分钟,即连接在10分钟内可复用,无需重新登录 } }
参数规则说明
- 当
CONN_MAX_AGE > 0时,Django 会将连接保存在当前线程的上下文内,有效期内的所有数据库操作都会复用该连接 - 若设置为
None,连接会一直复用直到被数据库侧主动断开,建议配合数据库的超时参数(如 MySQL 的wait_timeout)设置,避免使用僵尸连接 - 多 worker 部署场景下(如 Gunicorn、uWSGI 启动多进程),每个 worker 会独立维护自己的持久连接,不会跨进程共享
异常排查
如果配置完成后仍存在频繁新建连接的情况,优先排查两个点:
- 代码中是否手动调用了
connection.close()或close_old_connections()主动销毁连接 - 数据库侧的连接超时参数设置小于
CONN_MAX_AGE,导致连接被数据库主动关闭,Django 只能重新创建连接
相关截图
- 运行情况截图:

- SQL登录审计日志截图:

内容的提问来源于stack exchange,提问作者lifejustice
相关产品推荐
相关产品推荐

