fastapi-数据库连接参数
·
我来详细讲解一下这些数据库连接参数的作用:
engine = create_engine(
DATABASE_URL,
echo=False,
pool_pre_ping=True,
pool_recycle=3600,
pool_size=30,
max_overflow=70,
connect_args={
"connect_timeout": 30,
"charset": "utf8mb4",
}
)
参数详解
1. echo=False - SQL日志输出
- 作用:控制是否打印所有执行的SQL语句到日志
False:不打印SQL语句(生产环境推荐)True:打印所有SQL,便于调试,但会产生大量日志
2. pool_pre_ping=True - 连接健康检查 ⭐
- 作用:每次从连接池获取连接前,先发送一个简单的查询(如
SELECT 1)测试连接是否有效 - 为什么重要:
- 防止使用已断开的"僵尸连接"
- MySQL默认8小时会断开空闲连接,这个参数可以自动检测并重连
- 避免
MySQL server has gone away错误
- 性能影响:轻微(但比程序崩溃好得多)
3. pool_recycle=3600 - 连接回收时间 ⏰
- 作用:连接在池中存活超过 3600秒(1小时) 后,自动关闭并创建新连接
- 为什么设置:
- MySQL默认
wait_timeout=28800(8小时),但建议提前回收 - 防止长时间连接导致的内存泄漏
- 配合MySQL的连接超时策略
- MySQL默认
- 建议值:比MySQL的
wait_timeout短一些
4. pool_size=30 - 基础连接池大小 🏊
- 作用:连接池中常驻保持的数据库连接数量
- 你的设置:30个连接
- 适用场景:
- 华为云同步时会有大量并发数据库操作
- 多线程tag查询需要多个连接
- 前端多个用户同时访问
- 考虑因素:
pool_size = 预估并发请求数 × 每个请求平均持有连接时间
5. max_overflow=70 - 最大溢出连接数 🌊
- 作用:当基础连接池(30个)用完后,还能临时创建的额外连接数
- 总连接数上限:
pool_size + max_overflow = 30 + 70 = 100个连接 - 工作机制:
- 前30个连接:常驻在池中,不会关闭
- 第31-100个连接:临时创建,用完后关闭
- 为什么设置这么大:
- 华为云同步时可能同时有几十个tag查询线程
- 高峰期前端多个用户同时操作
- 防止连接不足导致请求排队
6. connect_args - MySQL驱动特定参数
6.1 connect_timeout=30 - 连接超时
- 作用:建立MySQL连接的最大等待时间为 30秒
- 默认值:通常是10秒
- 为什么增加:
- 网络不稳定时避免过早超时
- Kubernetes环境下Pod重启/网络抖动
- 数据库负载高时响应慢
6.2 charset="utf8mb4" - 字符集
- 作用:使用
utf8mb4字符集(UTF-8的完整实现) - 为什么重要:
- 支持emoji和特殊字符 😊
utf8mb4是真正的4字节UTF-8- MySQL的
utf8只支持3字节,不完整
- 应用场景:资源名称可能包含特殊字符
连接池工作流程示例
时刻1: 30个基础连接空闲在池中
[============================] (pool_size=30)
时刻2: 高峰期,50个请求同时到达
[============================] 使用完30个基础连接
[====================] 临时创建20个溢出连接 (max_overflow)
时刻3: 请求处理完成
[============================] 30个基础连接返回池中
[xxxxxxxxxxxxxxxxxxxx] 20个溢出连接被关闭
时刻4: 1小时后 (pool_recycle=3600)
[============================] 所有连接被回收,创建新连接
适合你的应用场景
你的配置 非常适合 华为云同步的场景:
✅ pool_pre_ping=True:防止长时间同步过程中连接断开
✅ pool_size=30:支持并发tag查询(你有多线程并发)
✅ max_overflow=70:高峰期100个并发连接,足够应付大量资源同步
✅ connect_timeout=30:Kubernetes环境下更稳定
建议监控指标
你可以通过以下方式监控连接池状态:
# 在需要时查看连接池状态
pool = engine.pool
print(f"连接池大小: {pool.size()}")
print(f"已签出连接: {pool.checkedout()}")
print(f"溢出连接: {pool.overflow()}")
print(f"已签入连接: {pool.checkedin()}")
如果经常看到 overflow 接近70,说明需要进一步增加 pool_size。如果 checkedout 长时间很高,说明有连接泄漏(没有正确关闭)。
更多推荐


所有评论(0)