Hyperf多业务模块隔离数据库连接需从连接定义、模型绑定、运行时切换三方面配合:在config/autoload/database.php中为各模块定义全小写无符号独立连接池(如user_db、order_db、log_db),模型层通过protected $connection指定专属连接,原生查询须Db::connection('name')前置声明,事务严禁跨池,连接池参数需按模块压测调优。

Hyperf 多业务模块隔离数据库连接,核心是让不同模块用不同数据库连接池,互不干扰、各自管理。不是简单加几个配置就行,得从连接定义、模型绑定、运行时切换三方面配合,否则容易串库或连接泄漏。
按模块定义独立连接池
在 config/autoload/database.php 的 'connections' 下为每个业务模块单独声明连接,名称全小写、无符号,比如:
-
user_db:用户中心专用,host 指向用户库地址,database 设为
user_center -
order_db:订单中心专用,driver 可设为
mysql或pgsql,根据实际适配 -
log_db:日志模块只读连接,显式加上
'read_only' => true防止误写
注意:default 连接建议保留但不用于业务逻辑,避免未显式指定时意外命中主库。
模型层绑定对应连接
每个模块的 Eloquent 模型主动绑定专属连接,而不是靠全局默认:
- 在
User模型顶部加protected $connection = 'user_db'; - 在
Order模型中设protected $connection = 'order_db'; - 关联查询时也要逐层指定,例如
User::with(['orders' => fn($q) => $q->on('order_db')])
这样能保证 User::all()、User::find(1) 等静态调用自动走 user_db,不污染其他模块上下文。
运行时动态切换更灵活
非模型场景(如原生查询、事务、命令行任务)需手动指定连接:
- 查日志表:
Db::connection('log_db')->table('sys_logs')->where('level', 'error')->get() - 跨模块事务必须单池内完成:
Db::connection('order_db')->transaction(...),不能混用user_db和order_db - Query Builder 不继承模型设置,
Db::table('users')永远走 default,务必前置connection()
事务尤其要注意——MySQL 从库不支持 BEGIN,跨连接池事务直接报错,设计上应避免跨库事务,改用最终一致性方案。
连接池参数要按模块压测调优
不同模块流量和耗时差异大,连接池不能统一配置:
- 用户模块 QPS 高、响应快,
max_connections可设为 20,min_connections设为 5 - 报表模块查询重、并发低,
max_connections设为 8 即可,但connect_timeout提高到 15s 防超时中断 - 所有连接池都设
max_idle_time => 30.0,避免空闲连接长期占用数据库资源
生产环境上线前,建议用 ab 或 wrk 对各模块单独压测,观察连接数峰值与回收行为是否匹配配置。


















