Django 4.2 默认不支持连接池,CONN_MAX_AGE 仅实现单连接复用,非真正连接池;高并发必须引入第三方方案,如 django-db-geventpool(需 gevent 环境)或 SQLAlchemy QueuePool。

Django 4.2 默认不支持连接池,别被 CONN_MAX_AGE 欺骗
Django 4.2 自身没有内置数据库连接池机制,CONN_MAX_AGE 控制的是「连接复用时长」,不是连接池。它只是让 Django 在请求结束后不立即关闭连接,而是缓存起来供后续请求复用——但这是单连接、无并发管理、无最小/最大连接数控制的简单复用。一旦并发请求数超过数据库连接上限(比如 PostgreSQL 默认 100),就会直接报 django.db.utils.OperationalError: FATAL: remaining connection slots are reserved for non-replication superuser connections。
真正需要连接池(如自动维护 5–20 个空闲连接、按需分配、超时回收),必须引入第三方库:
-
django-db-geventpool:适用于 gevent + uWSGI/Gunicorn(需协程模式) -
django-postgresql-pool(仅 PostgreSQL)或psycopg3自带的ConnectionPool(需手动集成) - 更通用且推荐的是
sqlalchemy+sqlalchemy.pool.QueuePool,绕过 Django ORM 直接管理连接池,再与 Django 共享连接字符串
用 django-db-geventpool 替换默认 PostgreSQL 后端(最轻量接入)
这个方案改动最小,只需改配置和安装依赖,适合已用 gevent 的项目:
- 安装:
pip install django-db-geventpool - 在
settings.py中替换数据库引擎:DATABASES = {<br> 'default': {<br> 'ENGINE': 'django_db_geventpool.backends.postgresql_psycopg2',<br> 'NAME': 'mydb',<br> 'USER': 'myuser',<br> 'PASSWORD': 'mypass',<br> 'HOST': 'localhost',<br> 'PORT': '5432',<br> 'OPTIONS': {<br> 'MAX_CONNS': 20,<br> 'MIN_CONNS': 5,<br> 'REUSE_CONNS': 10,<br> },<br> }<br>} -
MAX_CONNS是池中最多允许多少连接;MIN_CONNS是启动时预热的空闲连接数;REUSE_CONNS表示每个连接最多服务多少次请求后强制释放(防长连接泄漏) - ⚠️ 注意:必须运行在 gevent 环境下(如
gunicorn --worker-class gevent --workers 4 --worker-connections 100),否则会卡死或报RuntimeError: This event loop is already running
用 sqlalchemy.pool.QueuePool 手动管理连接池(跨数据库、可控性强)
如果你需要精细控制连接生命周期,或使用 MySQL/SQLite/Oracle,或不想绑定 gevent,推荐此方式。Django ORM 仍照常工作,只把「原始连接获取」交给 SQLAlchemy 管理:
提供使用 django-unfold (v0.56+) 构建高级 Django 管理界面的专业指导。当用户提及 django-unfold、unfold admin 等内容时使用此技能。
立即学习“Python免费学习笔记(深入)”;
- 安装:
pip install sqlalchemy - 在
settings.py或独立模块(如db_pool.py)中初始化池:from sqlalchemy import create_engine from sqlalchemy.pool import QueuePool engine = create_engine( 'postgresql+psycopg2://myuser:mypass@localhost:5432/mydb', poolclass=QueuePool, pool_size=10, max_overflow=20, pool_timeout=30, pool_recycle=3600, ) - 在需要原生 SQL 或性能敏感处调用:
with engine.connect() as conn:<br> result = conn.execute("SELECT now()")<br> print(result.fetchone()) - 关键参数:
pool_size是常驻连接数;max_overflow是可临时超出的连接数;pool_recycle强制重连防止 DB 超时断连(PostgreSQLtcp_keepalives_idle不生效时尤其重要) - ⚠️ 注意:不要在 Django Model 的
save()或 QuerySet 中混用该池——ORM 仍走自己的连接逻辑,混用可能造成事务隔离混乱
连接池没生效?先检查这三件事
很多问题不是配置错,而是环境或误用导致池“形同虚设”:
- Django 的
DEBUG=True会禁用连接复用(包括CONN_MAX_AGE和第三方池的复用逻辑),测试时务必关掉 - Gunicorn/uWSGI 进程模型不匹配:
django-db-geventpool必须配合--worker-class gevent,而普通syncworker 会为每个请求新建连接,池完全无效 - 数据库侧限制未调优:PostgreSQL 的
max_connections默认 100,若你启了 4 个 Gunicorn worker,每个池配MAX_CONNS=30,就超限了;要同步调大 PG 配置并重启服务
连接池本质是平衡「连接建立开销」和「连接资源占用」,不是加了就一定快——低并发场景反而可能因池管理带来额外延迟。上线前务必用 pg_stat_activity 或 SHOW STATUS LIKE 'Threads_connected' 观察真实连接数分布。

















