Hyperf协程连接池需按用途、协议、生命周期精细化配置,否则引发wait_timeout报错、连接泄漏等;必须分池命名、独立配置、参数联动DB限制,Swow环境下需重配pool结构并清缓存。

Hyperf协程连接池不能靠“改个数字就完事”,必须按用途分池、按协议隔离、按协程生命周期设参,否则轻则 wait_timeout 报错,重则连接泄漏、主从混写、监控失灵。
连接池命名和配置块必须独立且语义清晰
每个连接池(如 db.write、read_pool_1)都要在 config/autoload/databases.php 的 connections 数组里单独定义,不能复用 default 配置块。常见错误是只改了 host 或 database,漏掉 username、password、port 等全量字段,导致运行时报 Connection not found。
- 连接名必须全小写、不含点号(
read.pool❌,read_pool✅) - MySQL 与 PostgreSQL、MySQL 5.7 与 8.0 必须分池,不可共用同一配置块
-
default建议注释掉或留空,防止未显式指定时意外走主库 - 读库池名建议带地域或权重标识,如
read_pool_sh、read_pool_sz
写库池与读库池参数逻辑完全不同
写库求稳,读库求弹,参数不是“调大就行”,而是要联动 DB 层限制和业务特征。
- 写库(如
db.write):max_connections≤ MySQL 实例max_connections × 0.7(例:DB 设为 500,则池设 ≤350);wait_timeout推荐 3.0~5.0 秒;max_idle_time= DB 的wait_timeout − 30(如 DB 是 60 秒,则设 30 秒) - 读库(如
read_pool_1):fetch_mode建议设为PDO::FETCH_ASSOC,strict_type设false减少类型转换开销;wait_timeout可设 2.0~3.0 秒,加速异常排队失败;heartbeat必须开启,值设为max_idle_time / 2 - 所有池的
min_connections不建议设 0,写库至少 2,读库可设 1,避免冷启抖动
Swow 环境下必须重配,旧配置会失效
Hyperf 启用 Swow(SWOW_BASE)后,原 Swoole 兼容层的连接池逻辑不生效,继续沿用旧 pool 配置会导致连接数突增、idle 连接不回收、甚至 pool exhausted。
- 必须删除
databases.php中原有pool一级配置项,改用 Swow 专用结构:在'driver' => 'mysql'同级新增'pool'数组 - Swow 要求
check_interval≥ 3000(单位毫秒),低于此值心跳检测会中断;retry_interval不可为 0,否则连接失败永不重试 - 改完必须清空缓存:
rm -rf runtime/container,再php bin/hyperf.php start,否则旧 Pool 类实例残留,新参数不加载
最容易被忽略的是:连接池不是静态配置,而是协程上下文的一部分。事务中调用 Db::connection('other_pool') 不会切换事务连接,只会额外占一个连接——泄漏就从这里开始。真正要跨库操作,得用独立协程 + 显式连接,而不是在一个协程里反复 on() 切换。











