Hyperf数据库连接池通过配置自动管理,需启用enable_pool、合理设置min/max_connections,并在协程中使用Db::操作;避免阻塞调用和手动创建PDO,注意事务回滚与连接回收,配合监控调优。

Hyperf 的数据库连接池不是手动创建的,而是通过配置自动管理的。核心在于正确设置连接池参数、理解协程生命周期,并避免阻塞操作。
连接池配置要点
在 config/autoload/databases.php 中配置 MySQL 连接时,必须启用连接池并合理设置大小:
- enable_pool 设为 true(默认 false,不开启则无池化)
- min_connections 建议设为 1–5,保障低并发时快速响应
- max_connections 根据 DB 服务器承载力和业务峰值设定,通常 20–100 较稳妥(过高易触发 MySQL max_connections 限制)
- wait_timeout 和 heartbeat 可选开启,用于清理空闲或失效连接
协程内安全使用方式
Hyperf 中 DB 操作必须在协程上下文中进行,否则会退化为同步阻塞。所有查询都应通过 Db:: 或注入的 ConnectionInterface 执行:
- 控制器/服务中直接调用 Db::table('user')->where(...)->get() 即可自动从池中获取连接
- 避免在非协程环境(如 Swoole\Timer::tick 回调未显式启动协程)中调用 DB 方法
- 不手动 new PDO 或 mysqli,那会绕过连接池
连接泄漏与超时排查
连接池耗尽常表现为请求卡住或报 "No available connection"。常见原因:
- 事务未正确提交或回滚(Db::transaction() 忘记闭包结束,或异常未被捕获)
- 长耗时同步操作(如 sleep()、curl_exec 阻塞调用)占住连接不释放
- 协程被意外终止(如超时 kill),但连接未归还池中(Hyperf v2.2+ 已增强自动回收,但仍建议显式 try-finally 处理关键事务)
监控与调优建议
启用连接池监控可及时发现问题:
- 在 config/autoload/metrics.php 开启 db.pool 指标,配合 Prometheus 查看 hyperf_db_pool_idle_connections、hyperf_db_pool_used_connections
- 压测时观察 max_connections 是否频繁打满;若长期 idle 高、used 波动小,可适当调低 max_connections 节省资源
- 多库场景下,每个数据库需独立配置连接池,避免共用导致争抢










