必须使用 django-db-connection-pool 而非已停维护的 django-db-connections;django 默认连接管理不回收空闲连接,易因 mysql wait_timeout 导致断连异常;需替换 engine、禁用 pymysql、合理配置 pool_size、max_overflow、idle_timeout 和 recycle_sec,并在 wsgi.py 中显式关闭连接池。
必须用 django-db-connection-pool,别用 django-db-connections —— 后者在 django 4.2 中已停止维护,pool_options 配置不生效,连接池实际未启用。
为什么不能直接用 Django 自带的连接管理?
Django 默认每次请求都新建/复用连接,但不回收空闲连接,长连接下 MySQL 服务端可能主动断连(尤其 wait_timeout 超时后),导致后续请求抛出 InterfaceError: (0, '') 或 Lost connection to MySQL server during query。连接池能自动维护活跃连接、复用、超时回收,避免这类问题。
安装与 ENGINE 替换必须一步到位
只装包不改 ENGINE,连接池形同虚设。Django 不会自动劫持数据库 backend,必须显式指定:
- 运行
pip install django-db-connection-pool - 把
DATABASES['default']['ENGINE']改成'django_db_connection_pool.backends.mysql'(注意不是django.db.backends.mysql) - 删掉所有
__init__.py里pymysql.install_as_MySQLdb()的调用 ——django-db-connection-pool依赖mysqlclient,PyMySQL 会导致AttributeError: 'Connection' object has no attribute 'encoding'
关键参数要按场景设,不是填默认值就完事
POOL_SIZE 和 MAX_OVERFLOW 不是越大越好;设太高会压垮 MySQL 的 max_connections,设太低又起不到池化作用。真实建议如下:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
-
'POOL_SIZE': 10:适用于单机开发或小流量部署(CPU 核数 ≤ 4) -
'MAX_OVERFLOW': 5:突发流量时允许额外创建 5 个连接,避免排队等待 -
'IDLE_TIMEOUT': 300(秒):空闲连接 5 分钟后自动关闭,匹配 MySQL 默认wait_timeout=28800(8 小时),但比它更激进,防僵死连接 -
'RECYCLE_SEC': 1800(需在POOL_OPTIONS下):强制每 30 分钟重连一次,绕过 MySQL 8+ 的caching_sha2_password认证缓存失效问题
wsgi.py 关闭连接池容易被忽略
生产环境用 Gunicorn/UWSGI 时,worker 进程常驻,不显式关闭连接池会导致进程退出时连接泄漏,下次启动可能因端口/连接数耗尽失败。必须在 wsgi.py 底部加:
from django_db_connection_pool import connection_pool connection_pool.close()
这不是“可选优化”,而是上线前必做项。漏掉它,压测时连接数会随时间线性增长,直到 MySQL 报 Too many connections。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










