Hyperf多数据库连接配置不生效的根本原因在于框架未加载、未引用或被覆盖:需确认db.php中各连接有唯一键名且结构完整,代码中显式指定连接名(如Db::connection('mysql2')),Eloquent模型声明$connection,DI注入用@Inject("db.mysql2")并验证容器ID存在,每个连接块独立配pool参数,改配置后清空runtime/container并重启,必要时执行di:init-proxy重建缓存。

Hyperf 多数据库连接配置不生效,通常不是“写错配置”这么简单,而是多个环节耦合失效:扫描路径漏配、连接名未被正确引用、连接池参数冲突、或运行时缓存未更新。重点不在“有没有写”,而在“框架有没有读到、有没有用上、有没有被覆盖”。
确认连接配置是否被框架加载
Hyperf 不会自动加载所有 config/autoload/db.php 里的数据库块,只认你显式声明的连接名。
- 检查
config/autoload/db.php中每个数据库配置是否都带了唯一键名(如'mysql2'、'pgsql'),且结构完整(含driver、host、database等必要字段) - 在代码中使用时,必须明确指定连接名:
Db::connection('mysql2')->select(...),不能只写Db::select(...)(那默认走default) - 若用 Eloquent,需在 Model 中声明:
protected $connection = 'mysql2';,否则仍走 default
检查注解或 DI 注入是否绑定到正确连接
用 #[Inject] 或构造函数注入 ConnectionInterface 时,Hyperf 默认注入的是 default 连接,多连接需手动指定。
- 注入指定连接:用
#[Inject("db.mysql2")](注意命名空间前缀需与容器 ID 一致) - 查容器 ID:运行
php bin/hyperf.php di:show | grep db\.,确认db.mysql2是否存在;若无,说明该连接未注册进容器 - 确保
db.php已被正确加载——检查config/autoload.php是否包含db.php的 require 行
验证连接池参数是否实际生效
多数据库场景下,容易忽略各连接池独立配置,尤其 pool.max_connections 和 pool.wait_timeout 写错位置会导致“配置写了但没起作用”。
- 每个数据库配置块内必须有独立的
'pool' => [...],不能只在default下配,其他连接复用 - Swow 环境下,MySQL 和 PostgreSQL 的 pool 配置格式不同:MySQL 要删旧 pool、重写 Swow 专用结构;PostgreSQL 则需严格匹配
max_connections ≤ DB 侧 max_connections × 0.7 - 改完配置后必须清空
runtime/container并重启服务,否则旧 Pool 实例残留,新配置不加载
排查运行时缓存与扫描路径问题
Hyperf 启动时会生成连接工厂类缓存,若缓存未更新或路径未扫描,新加的连接名根本不会出现在容器中。
- 执行
php bin/hyperf.php di:init-proxy强制重建代理缓存(尤其改过db.php或新增连接后) - 确认
config/autoload/annotations.php中scan.paths包含了所有定义连接配置的目录(如BASE_PATH . '/config/autoload') - Docker 部署时,检查
.dockerignore是否误过滤了config/或runtime/目录











