Laravel数据库连接故障切换日志记录,如何记录主从切换事件?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1139个文字,预计阅读时间需要5分钟。
在默认情况下,Laravel 不会主动记录数据库连接切换,你只需配置读写分离即可。以下是一个简单的配置示例:
核心是监听 Illuminate\Database\Events\ConnectionEstablished 事件,它在每次新连接真正建立时触发(不是每次 DB::connection() 调用,而是底层 PDO 实例创建后)。但注意:它不区分“主”还是“从”,只告诉你连上了哪个配置名。
- 在
AppServiceProvider::boot()中注册监听器,别放错生命周期 - 通过
$event->connection->getConfig('name')拿到当前连接名(比如mysql-read-1),再比对预设的从库列表来判断是否属于切换 - 避免在监听器里做耗时操作(如写文件、发 HTTP 请求),否则拖慢查询;建议用队列或异步 logger
- 别监听
StatementPrepared或QueryExecuted—— 它们发生在连接已建立之后,无法反映“切换”本身
如何识别一次真正的“从库切换”而非复用连接
Laravel 的连接池和连接复用机制会让同一个连接被反复使用,所以不能单靠“事件触发次数”判断是否切换。关键要看连接实例的唯一标识是否变化。
ConnectionEstablished 事件对象里没有直接暴露连接 ID,但你可以用 spl_object_hash($event->connection->getPdo()) 获取底层 PDO 对象哈希值。
本文共计1139个文字,预计阅读时间需要5分钟。
在默认情况下,Laravel 不会主动记录数据库连接切换,你只需配置读写分离即可。以下是一个简单的配置示例:
核心是监听 Illuminate\Database\Events\ConnectionEstablished 事件,它在每次新连接真正建立时触发(不是每次 DB::connection() 调用,而是底层 PDO 实例创建后)。但注意:它不区分“主”还是“从”,只告诉你连上了哪个配置名。
- 在
AppServiceProvider::boot()中注册监听器,别放错生命周期 - 通过
$event->connection->getConfig('name')拿到当前连接名(比如mysql-read-1),再比对预设的从库列表来判断是否属于切换 - 避免在监听器里做耗时操作(如写文件、发 HTTP 请求),否则拖慢查询;建议用队列或异步 logger
- 别监听
StatementPrepared或QueryExecuted—— 它们发生在连接已建立之后,无法反映“切换”本身
如何识别一次真正的“从库切换”而非复用连接
Laravel 的连接池和连接复用机制会让同一个连接被反复使用,所以不能单靠“事件触发次数”判断是否切换。关键要看连接实例的唯一标识是否变化。
ConnectionEstablished 事件对象里没有直接暴露连接 ID,但你可以用 spl_object_hash($event->connection->getPdo()) 获取底层 PDO 对象哈希值。

