生产环境要避免 Django 频繁创建数据库连接,最直接的做法是在 settings.py 中设置 CONN_MAX_AGE 启用持久连接,若并发量极高则建议引入 PgBouncer 或 ProxySQL 等中间件层。
先说结论:默认配置下 Django 每个请求结束后会关闭数据库连接,高并发时会导致数据库连接数暴涨。需注意 CONN_MAX_AGE 仅启用持久连接而非完整连接池,每个工作进程仍会独立维护连接。
- 先定位:确认数据库报错是否为“太多连接”或握手耗时过长
- 先做:在 settings.py 中配置 CONN_MAX_AGE 大于 0(建议 600 秒)
- 再验证:监控数据库活跃连接数是否趋于平稳
核心配置方案
找到项目的 settings.py,定位到 DATABASES 配置项。增加 CONN_MAX_AGE 参数以启用持久连接。该参数表示连接存活时间(秒),设置为 0 表示禁用持久连接。
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydb',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '5432',
'CONN_MAX_AGE': 600, # 建议 600 秒,需小于负载均衡器或数据库超时时间
'CONN_HEALTH_CHECKS': True, # Django 4.1+ 支持,获取连接前检查健康状态
}
}通常建议设置为 600 秒,但需确保该值小于负载均衡器或数据库的超时时间,避免 stale connection。注意不同数据库引擎均支持该参数,但行为略有差异。
验证连接复用
1. 检查当前数据库状态
登录数据库查看当前连接数。MySQL 可使用 SHOW STATUS LIKE 'Threads_connected';,PostgreSQL 可查询 SELECT count(*) FROM pg_stat_activity;。确认是否接近最大连接数限制。
2. 观察连接曲线
使用监控工具(如 Prometheus + Grafana 或数据库自带监控)查看活跃连接数。生效後,连接数不应随请求量线性暴涨,而是维持在一定水位。
3. 检查应用日志
确认不再出现“Too many connections