Laravel 5 配置读写分离和源码分析
一,配置过程:
Laravel5 读写分离配置比较简单,只需修改 config/database.php,下面以 MySQL 数据库为例
内容如下
设置完毕之后,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 是否配置了读写分离数据库
2,看看如何创建读库和写库的链接
3,多个读库会选择哪个呢
4,写库也是随机选择的
总结:
1,可以设置多个读库和多个写库,或者不同组合,比如一个写库两个读库
2,每次只创建一个读库链接和一个写库链接,从多个库中随机选择一个;
四,源码分析:调用 select 时先判断使用读库还是写库,而 insert/update/delete 统一使用写库
主要文件:Illuminate/Database/Connection.php
看看几个重要的函数
1,select 函数根据第三个输入参数判断使用读库还是写库
2, insert/update/delete 统一使用写库
总结:
1,getReadPdo () 获得读库链接,getPdo () 获得写库链接;
2,select () 函数根据第三个参数判断使用读库还是写库;
五,强制使用写库
有时候,我们需要读写实时一致,写完数据库后,想马上读出来,那么读写都指定一个数据库即可。
虽然 Laravel5 配置了读写分离,但也提供了另外的方法强制读写使用同一个数据库。
实现原理:上面 $this->select () 时指定使用写库的链接,即第三个参数 useReadPdo 设置为 false 即可
有几个方法可实现
1,调用方法
DB::table('posts')->selectFromWriteConnection('*')->where('id', $id);
源码解释:通过 selectFromWriteConnection () 函数
主要文件:Illuminate/Database/Connection.php
2,调用方法
User::onWriteConnection()->find($id);
源码解释:通过 onWriteConnection () 函数
主要文件:Illuminate/Database/Eloquent/Model
看看 query builder 如何指定使用写库
主要文件:Illuminate/Database/Query/Builder
————————————————
原文作者:luckybirdme
转自链接:https://learnku.com/laravel/t/1879/laravel-5-configuration-read-and-write-separation-and-source-analysis
版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。