Laravel读写分离场景下如何检测SQL实际使用的读/写连接
检测Laravel查询实际使用读/写连接的方法
实现方案
Laravel的Connection实例提供的getPdo()方法会直接返回当前查询实际使用的PDO实例,将它和连接实例的pdo(写连接实例)、readPdo(读连接实例)做比对即可判断当前使用的连接类型。
修改监听代码如下即可打印连接类型:
DB::listen(function ($query) { // 获取当前实际使用的PDO实例 $usedPdo = $query->connection->getPdo(); if ($usedPdo === $query->connection->readPdo) { dump('当前查询使用【读连接】'); } else { dump('当前查询使用【写连接】'); } }); // 测试读操作 $table = DB::table('table')->first(); // 测试写操作 DB::table('table')->insert(['col' => 'val']); // 测试事务内的读操作 DB::transaction(function () { DB::table('table')->first(); });
附加校验方法
如果需要确认连接的实际信息,可以打印当前PDO的连接属性校验:
DB::listen(function ($query) { $usedPdo = $query->connection->getPdo(); // 打印当前连接的状态信息,包含host等配置,可和你的读写库配置做比对 dump('当前连接详情:' . $usedPdo->getAttribute(PDO::ATTR_CONNECTION_STATUS)); });
补充说明
Laravel读写分离的默认路由规则:
- 普通读操作默认走读连接
- 所有写操作默认走写连接
- 开启事务后,事务内的所有读、写操作都会走写连接,避免脏读
内容的提问来源于stack exchange,提问作者Masood Khan
相关产品推荐
相关产品推荐

