必须用连接池而非单连接:因单连接不支持并发、易泄漏、状态污染且线程不安全;sqlalchemy+queuepool是生产标准,需设pool_size=10、max_overflow=20、pool_recycle=3600、pool_pre_ping=true。

必须用连接池,不能靠单个连接“手动保持”。Python Web 应用里所谓“持久化数据库连接”,本质是连接池(Connection Pool)在起作用——它维持一批可复用的空闲连接,而不是让每个请求都新建再关闭。直接对 sqlite3.connect() 或 psycopg2.connect() 返回的对象做长连接管理,不仅无效,还会导致连接泄漏、超时、线程不安全等问题。
为什么不能直接复用单个数据库连接
数据库连接不是普通变量,它绑定着 TCP 连接、事务状态、会话变量(如 search_path、timezone)、服务端游标等上下文。Web 框架(如 Flask、FastAPI)通常多线程或多协程并发处理请求,若多个请求共享一个连接:
- 事务会互相污染(比如 A 请求未提交的
INSERT被 B 请求看到) - 连接可能被意外关闭(如网络闪断后未重连,后续请求直接报
OperationalError: server closed the connection unexpectedly) - PostgreSQL 等数据库会限制单连接并发执行数,容易卡死
- 无法自动回收空闲连接,最终耗尽数据库最大连接数(
max_connections)
SQLAlchemy + QueuePool 是最稳妥的落地方式
SQLAlchemy 的 QueuePool 是生产环境事实标准,它默认启用连接检测和回收机制。关键配置项必须显式设置:
-
pool_size=10:初始和最小空闲连接数,太小会导致排队等待 -
max_overflow=20:允许临时超出池大小的连接数(仅限阻塞式获取),避免突发流量直接失败 -
pool_recycle=3600:强制回收存活超 1 小时的连接,防止数据库端因tcp_keepalive不生效而静默断连 -
pool_pre_ping=True:每次从池中取出连接前,先发一条SELECT 1检测是否还活着,避免拿到已断开的连接
示例代码:
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
from sqlalchemy import create_engine from sqlalchemy.pool import QueuePool <p>engine = create_engine( "postgresql+psycopg2://user:pass@localhost/db", poolclass=QueuePool, pool_size=10, max_overflow=20, pool_recycle=3600, pool_pre_ping=True, echo=False # 生产环境务必关掉 )</p>
异步场景下必须用 asyncpg + asyncpg.Pool
如果你用的是 FastAPI + async def 路由,千万别把同步连接池(如 SQLAlchemy 默认)直接 await ——它会阻塞事件循环。正确做法是切换到底层异步驱动:
- 弃用
psycopg2,改用asyncpg - 不用
create_engine,直接初始化asyncpg.Pool -
min_size和max_size对应同步池的pool_size和max_overflow - 必须设
max_inactive_connection_lifetime=300(秒),否则空闲连接不会被主动清理,容易堆积
示例:
import asyncpg <p>pool = await asyncpg.create_pool( host="localhost", database="db", user="user", password="pass", min_size=5, max_size=20, max_inactive_connection_lifetime=300 )</p><h1>在路由中用:async with pool.acquire() as conn:</h1><p></p>
真正容易被忽略的点是:连接池参数必须和数据库服务器的配置对齐。比如 PostgreSQL 的 tcp_keepalives_idle 设为 600 秒,但你的 pool_recycle 设成 7200,那中间一小时就可能出现“连接已断,池还不知道”的静默失败。调参永远要两端一起看。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










