Hyperf通过配置多个独立命名数据库连接(如master、report)实现多库操作,需在databases.php中定义各连接参数并单独配置连接池,运行时用Db::connection('name')切换,模型可绑定指定连接,注意连接池隔离与监控验证。

Hyperf 支持通过配置多个数据库连接实现多库操作,比如读写分离、跨库查询或业务分库。关键不是改单个连接,而是定义多个独立连接名,并在代码中按需调用。
在 config/autoload/databases.php 中定义多个连接
打开数据库配置文件,把 default 改为一个连接,再新增其他命名连接(如 slave1、tenant_a):
- 每个连接必须有唯一键名(如
'master'、'report'),不能重复 - 各连接可指定不同 host、port、database、用户名和密码
-
pool参数建议单独配置,避免共用连接池导致资源争抢(例如max_connections按实际负载设) - 若使用环境变量,推荐为每个连接设置独立前缀,如
DB_MASTER_HOST和DB_REPORT_HOST
使用 Db::connection() 切换连接
运行时通过连接名获取对应实例,不依赖全局 default:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
Db::connection('master')->table('users')->get()Db::connection('report')->select('SELECT COUNT(*) FROM logs')- 模型也可绑定特定连接:
protected $connection = 'report';
配合连接池参数做基础隔离
多个连接共享 Swoole 协程环境,但连接池彼此独立。需注意:
- 每个连接的
pool.max_connections应根据该库的承载能力设置,避免某库打满拖垮整体 -
pool.max_idle_time建议统一设为 ≤30 秒,尤其在高可用场景下防止失效连接滞留 - 若某连接用于只读报表类请求,可适当调低
min_connections,减少空闲资源占用
验证与调试小技巧
上线前建议快速验证各连接是否可达:
- 写个命令行命令,循环调用
Db::connection($name)->raw('SELECT @@server_id, VERSION()') - 开启
db.query_log配置,观察日志中 SQL 是否命中预期连接 - 用
swoole_table或 Prometheus 暴露各连接池的in_use和idle数量,便于监控水位










