Laravel 5 配置读写分离和源码分析

一,配置过程:

Laravel5 读写分离配置比较简单,只需修改 config/database.php,下面以 MySQL 数据库为例
内容如下

Laravel 5 配置读写分离和源码分析
设置完毕之后,Laravel5 默认将 select 的语句让 read 指定的数据库执行,insert/update/delete 则交给 write 指定的数据库,达到读写分离的作用。
这些设置对原始查询 raw queries,查询生成器 query builder,以及对象映射 Eloquent 都生效。
官网解释如下:
Sometimes you may wish to use one database connection for SELECT statements, and another for INSERT, UPDATE, and DELETE statements. Laravel makes this a breeze, and the proper connections will always be used whether you are using raw queries, the query builder, or the Eloquent ORM

二,实现原理

Laravel5 读写分离主要有两个过程:
第一步,根据 database.php 配置,创建写库和读库的链接 connection
第二步,调用 select 时先判断使用读库还是写库,而 insert/update/delete 统一使用写库

三,源码分析:根据 database.php 配置,创建写库和读库的链接 connection

主要文件:Illuminate/Database/Connectors/ConnectionFactory.php
来看看几个重要的函数:

1,判断 database.php 是否配置了读写分离数据库

Laravel 5 配置读写分离和源码分析
2,看看如何创建读库和写库的链接

Laravel 5 配置读写分离和源码分析
3,多个读库会选择哪个呢

Laravel 5 配置读写分离和源码分析
4,写库也是随机选择的

Laravel 5 配置读写分离和源码分析
总结:

1,可以设置多个读库和多个写库,或者不同组合,比如一个写库两个读库

2,每次只创建一个读库链接和一个写库链接,从多个库中随机选择一个;

四,源码分析:调用 select 时先判断使用读库还是写库,而 insert/update/delete 统一使用写库

主要文件:Illuminate/Database/Connection.php
看看几个重要的函数

1,select 函数根据第三个输入参数判断使用读库还是写库

 Laravel 5 配置读写分离和源码分析

2, insert/update/delete 统一使用写库

Laravel 5 配置读写分离和源码分析

Laravel 5 配置读写分离和源码分析

Laravel 5 配置读写分离和源码分析
总结:

1,getReadPdo () 获得读库链接,getPdo () 获得写库链接;

2,select () 函数根据第三个参数判断使用读库还是写库;

五,强制使用写库

有时候,我们需要读写实时一致,写完数据库后,想马上读出来,那么读写都指定一个数据库即可。
虽然 Laravel5 配置了读写分离,但也提供了另外的方法强制读写使用同一个数据库。

实现原理:上面 $this->select () 时指定使用写库的链接,即第三个参数 useReadPdo 设置为 false 即可

有几个方法可实现
1,调用方法
DB::table('posts')->selectFromWriteConnection('*')->where('id', $id);

源码解释:通过 selectFromWriteConnection () 函数
主要文件:Illuminate/Database/Connection.php

Laravel 5 配置读写分离和源码分析
2,调用方法

User::onWriteConnection()->find($id);

源码解释:通过 onWriteConnection () 函数
主要文件:Illuminate/Database/Eloquent/Model

Laravel 5 配置读写分离和源码分析
看看 query builder 如何指定使用写库
主要文件:Illuminate/Database/Query/Builder

Laravel 5 配置读写分离和源码分析

————————————————
原文作者:luckybirdme
转自链接:https://learnku.com/laravel/t/1879/laravel-5-configuration-read-and-write-separation-and-source-analysis
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。