Hyperf协程内可安全高效并发查询多个数据库,需先在database.php中为各库配置独立连接池;原生查询和ORM模型均支持按连接名切换,跨库JOIN需应用层合并,事务不跨库,强一致性需TCC/Saga等方案。

可以,Hyperf 协程内能安全、高效地同时查询多个数据库,前提是多个库已正确定义并启用连接池。
多库配置是前提
必须先在 config/autoload/database.php 中为每个库单独配置连接,例如:
'connections' => ['mysql_main' => [...], 'mysql_log' => [...], 'pgsql_report' => [...]]- 每个连接需指定唯一名称,并配置独立的
pool参数(如min_connections、max_connections) - 不同库可使用不同驱动(MySQL/PostgreSQL/SQLite),互不影响
协程内按需切换连接
查询时通过连接名显式指定目标库,所有操作天然协程安全:
- 原生查询:
Db::connection('mysql_main')->select(...)和Db::connection('mysql_log')->insert(...)可并发调用 - ORM 模型:在模型类中设置
protected string $connection = 'mysql_log'; - 跨库 JOIN 不支持直接写 SQL,但可用应用层合并:分别查
users和user_profiles,再用集合collect($users)->keyBy('id')->mapWithKeys(...)关联
注意连接池与资源隔离
每个库连接都独占一个连接池,不会互相抢占:
- 若同时发起 5 个对
mysql_main的查询 + 3 个对mysql_log的查询,它们分别从各自池中取连接 - 需检查各库的
max_connections配置是否足够,避免某库池耗尽阻塞协程 - 不建议在单个协程里串行查 10+ 个库——应评估是否真需同步等待,可改用
Co\run或Parallel并发调度
事务不能跨库保证一致性
Hyperf 原生事务仅作用于单个连接:
-
Db::connection('mysql_main')->transaction(...)对mysql_log无影响 - 如需多库强一致,得引入 TCC、Saga 或 binlog 同步等最终一致性方案,不能依赖本地事务
- 日志类、统计类查询通常无需跨库事务,优先走无事务读取提升性能











