Hyperf 实现多数据库连接的关键是配置多个命名连接并在运行时显式指定连接名,而非仅修改配置后重启;需在 databases.php 中定义含唯一名称的 connections 数组,各连接须完整声明驱动、地址等参数并配置连接池,运行时通过 Db::connection('name') 或模型 $connection 属性调用,注意大小写敏感及配置一致性。

Hyperf 实现多数据库连接,关键不是“修改 config 后重启生效”,而是通过配置多个命名连接 + 运行时按需调用。改配置只是第一步,真正起作用的是连接名(connection name)的显式指定。
在 databases.php 中定义多个连接
打开 config/autoload/databases.php,确保返回的是一个包含 connections 键的数组。每个子数组代表一个独立数据库连接,必须有唯一名称:
- default 是默认连接名,不指定时自动使用它
- 其他连接如
log_db、report_db、mysql_v80_local等,需完整声明driver、host、port、database、username、password - 建议为不同版本/部署方式的库起语义化名字,例如
mysql_v57_rds或pgsql_v14_cloud,避免用db1、db2 - 每个连接都应配置
pool子项,尤其是min_connections和max_connections,数值要匹配目标数据库的实际承载能力
运行时切换连接:Query Builder 和 Eloquent
连接名定义好后,无需重启服务,直接在代码中按需调用:
- Query Builder:用
Db::connection('log_db')->table('logs')->get() - 事务:用
Db::connection('report_db')->transaction(...) - Eloquent 模型:在模型类中设置
protected $connection = 'log_db'; - 注意:Eloquent 的
$connection属性值必须与配置中的连接名完全一致(大小写敏感、无空格)
连接池和驱动兼容性细节
不同数据库版本或部署形态可能需要差异化配置:
- MySQL 8.0 推荐加
'options' => [PDO::MYSQL_ATTR_SSL_MODE => PDO::SSL_NONE, PDO::ATTR_EMULATE_PREPARES => false] - MySQL 5.7 可能需设
PDO::ATTR_EMULATE_PREPARES => true - 所有连接都建议显式开启连接池:
'pool' => ['enable_pool' => true, ...] - charset 和 collation 建议统一设为
utf8mb4和utf8mb4_unicode_ci,避免中文乱码或排序异常
验证和调试小技巧
配置完成后快速确认是否生效:
- 执行一条跨库查询,比如
Db::connection('log_db')->select('SELECT VERSION() as v');,看返回是否是目标库版本 - 在日志里打印当前连接对象:
var_dump(Db::connection('report_db')->getPdo()); - 检查连接池状态:Hyperf 提供
hyperf:pool:list命令可查看各连接池当前活跃连接数 - 若报错 “Connection [xxx] not configured”,请核对配置键名、文件路径(是
databases.php而非database.php)、以及命名是否拼写一致


















