Laravel 5 配置数据库主从读写分离和源码分析_互联网俱乐部的博客-CSDN博客_usewritepdo


本站和网页 https://blog.csdn.net/hackercn9/article/details/54881068 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Laravel 5 配置数据库主从读写分离和源码分析_互联网俱乐部的博客-CSDN博客_usewritepdo
Laravel 5 配置数据库主从读写分离和源码分析
互联网俱乐部
于 2017-02-05 14:51:33 发布
10319
收藏
分类专栏:
laravel
程序人生
mysql
文章标签:
laravel
读写分离和源码分析
mysql主从
数据库读写分离
laravel
同时被 3 个专栏收录
1 篇文章
0 订阅
订阅专栏
程序人生
2 篇文章
0 订阅
订阅专栏
mysql
2 篇文章
0 订阅
订阅专栏
原文地址:Laravel5配置读写分离和源码分析
一,配置过程:
Laravel5读写分离配置比较简单,只需修改config/database.php,下面以MySQL数据库为例 内容如下 'mysql' => [
'read' => [
'host' => '192.168.1.1'
],
'write' => [
'host' => '196.168.1.2'
],
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
设置完毕之后,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是否配置了读写分离数据库
/**
* Establish a PDO connection based on the configuration.
* @param array $config
* @param string $name
* @return \Illuminate\Database\Connection
*/
public function make(array $config, $name = null)
$config = $this->parseConfig($config, $name);
// 如果配置了读写分离,则同时创建读库和写库的链接
if (isset($config['read'])) {
return $this->createReadWriteConnection($config);
// 如果没有配置,默认创建单个数据库链接
return $this->createSingleConnection($config);
2,看看如何创建读库和写库的链接
/**
* Create a single database connection instance.
* @param array $config
* @return \Illuminate\Database\Connection
*/
protected function createReadWriteConnection(array $config)
// 获取写库的配置信息,并创建链接
$connection = $this->createSingleConnection($this->getWriteConfig($config));
// 创建读库的链接
return $connection->setReadPdo($this->createReadPdo($config));
3,多个读库会选择哪个呢
/**
* Get the read configuration for a read / write connection.
* @param array $config
* @return array
*/
protected function getReadConfig(array $config)
$readConfig = $this->getReadWriteConfig($config, 'read');
// 如果数组即多个读库,那么通过随机函数array_rand()挑一个,默认取第一个
if (isset($readConfig['host']) && is_array($readConfig['host'])) {
$readConfig['host'] = count($readConfig['host']) > 1
? $readConfig['host'][array_rand($readConfig['host'])]
: $readConfig['host'][0];
return $this->mergeReadWriteConfig($config, $readConfig);
4,写库也是随机选择的
/**
* Get a read / write level configuration.
* @param array $config
* @param string $type
* @return array
*/
protected function getReadWriteConfig(array $config, $type)
// 如果多个,那么通过随机函数array_rand()挑一个
if (isset($config[$type][0])) {
return $config[$type][array_rand($config[$type])];
return $config[$type];
总结:
1,可以设置多个读库和多个写库,或者不同组合,比如一个写库两个读库
2,每次只创建一个读库链接和一个写库链接,从多个库中随机选择一个;
四,源码分析:调用select时先判断使用读库还是写库,而insert/update/delete统一使用写库
主要文件:Illuminate/Database/Connection.php 看看几个重要的函数
1,select函数根据第三个输入参数判断使用读库还是写库
/**
* Run a select statement against the database.
* @param string $query
* @param array $bindings
* @param bool $useReadPdo
* @return array
*/
public function select($query, $bindings = [], $useReadPdo = true)
return $this->run($query, $bindings, function ($me, $query, $bindings) use ($useReadPdo) {
if ($me->pretending()) {
return [];
// For select statements, we'll simply execute the query and return an array
// of the database result set. Each element in the array will be a single
// row from the database table, and will either be an array or objects.
// 根据$useReadPdo参数,判断使用读库还是写库;
// true使用读库,false使用写库;默认使用读库
$statement = $this->getPdoForSelect($useReadPdo)->prepare($query);
$statement->execute($me->prepareBindings($bindings));
$fetchArgument = $me->getFetchArgument();
return isset($fetchArgument) ?
$statement->fetchAll($me->getFetchMode(), $fetchArgument, $me->getFetchConstructorArgument()) :
$statement->fetchAll($me->getFetchMode());
});
/**
* Get the PDO connection to use for a select query.
* @param bool $useReadPdo
* @return \PDO
*/
protected function getPdoForSelect($useReadPdo = true)
// 根据$useReadPdo参数,选择PDO即判断使用读库还是写库;
// true使用读库getReadPdo,false使用写库getPdo;
return $useReadPdo ? $this->getReadPdo() : $this->getPdo();
2, insert/update/delete统一使用写库
/**
* Run an insert statement against the database.
* @param string $query
* @param array $bindings
* @return bool
*/
public function insert($query, $bindings = [])
return $this->statement($query, $bindings);
/**
* Run an update statement against the database.
* @param string $query
* @param array $bindings
* @return int
*/
public function update($query, $bindings = [])
return $this->affectingStatement($query, $bindings);
/**
* Run a delete statement against the database.
* @param string $query
* @param array $bindings
* @return int
*/
public function delete($query, $bindings = [])
return $this->affectingStatement($query, $bindings);
/**
* Execute an SQL statement and return the boolean result.
* @param string $query
* @param array $bindings
* @return bool
*/
public function statement($query, $bindings = [])
return $this->run($query, $bindings, function ($me, $query, $bindings) {
if ($me->pretending()) {
return true;
$bindings = $me->prepareBindings($bindings);
// 直接调用写库
return $me->getPdo()->prepare($query)->execute($bindings);
});
/**
* Run an SQL statement and get the number of rows affected.
* @param string $query
* @param array $bindings
* @return int
*/
public function affectingStatement($query, $bindings = [])
return $this->run($query, $bindings, function ($me, $query, $bindings) {
if ($me->pretending()) {
return 0;
// For update or delete statements, we want to get the number of rows affected
// by the statement and return that back to the developer. We'll first need
// to execute the statement and then we'll use PDO to fetch the affected.
// 直接调用写库
$statement = $me->getPdo()->prepare($query);
$statement->execute($me->prepareBindings($bindings));
return $statement->rowCount();
});
总结:
1,getReadPdo()获得读库链接,getPdo()获得写库链接;
2,select()函数根据第三个参数判断使用读库还是写库;
五,强制使用写库
有时候,我们需要读写实时一致,写完数据库后,想马上读出来,那么读写都指定一个数据库即可。 虽然Laravel5配置了读写分离,但也提供了另外的方法强制读写使用同一个数据库。
实现原理:上面$this->select()时指定使用写库的链接,即第三个参数useReadPdo设置为false即可
有几个方法可实现 1,调用方法 DB::table('posts')->selectFromWriteConnection('*')->where('id', $id);
源码解释:通过selectFromWriteConnection()函数 主要文件:Illuminate/Database/Connection.php
/**
* Run a select statement against the database.
* @param string $query
* @param array $bindings
* @return array
*/
public function selectFromWriteConnection($query, $bindings = [])

// 上面有解释$this->select()函数的第三个参数useReadPdod的意义
// 第三个参数是 false,所以 select 时会使用写库,而不是读库
return $this->select($query, $bindings, false);
2,调用方法
User::onWriteConnection()->find($id);
源码解释:通过onWriteConnection()函数 主要文件:Illuminate/Database/Eloquent/Model
/**
* Begin querying the model on the write connection.
* @return \Illuminate\Database\Query\Builder
*/
public static function onWriteConnection()
$instance = new static;
// query builder 指定使用写库
return $instance->newQuery()->useWritePdo();
看看query builder如何指定使用写库 主要文件:Illuminate/Database/Query/Builder
/**
* Use the write pdo for query.
* @return $this
*/
public function useWritePdo()
// 指定使用写库,useWritePdo 为true
$this->useWritePdo = true;
return $this;
/**
* Run the query as a "select" statement against the connection.
* @return array
*/
protected function runSelect()
// 执行select时,useWritePdo原值为true,这里取反,被改成false;
// 即$this->select()函数第三个参数为false,所以使用写库;
return $this->connection->select($this->toSql(), $this->getBindings(), ! $this->useWritePdo);
互联网俱乐部
关注
关注
点赞
收藏
评论
Laravel 5 配置数据库主从读写分离和源码分析
原文地址:Laravel5配置读写分离和源码分析一,配置过程:Laravel5读写分离配置比较简单,只需修改config/database.php,下面以MySQL数据库为例 内容如下 'mysql' => ['read' => [ 'host' => '192.168.1.1'],'write' => [ 'host' => '196.168.
复制链接
扫一扫
专栏目录
Laravel数据库读写分离
huangfenhu的博客
08-25
554
配置数据库读写分离连接
理论上来说,配置数据库读写分离连接也属于配置多个数据库连接的范畴,但是由于是一个比较特殊又很常见的使用场景,所以我们单独来讨论,Laravel 也对此进行了单独支持。
随着应用访问量的增长,对数据库进行读写分离可以有效的提升应用整体性能,关于数据库层面的读写分离配置不属于本教程讨论范畴,我们这里只讨论从应用层面如何在 Laravel 项目中配置读写分离连接。Laravel 框架数据库底层代码对数据库读写分离进行了支持,所以我们需要遵循底层实现进行读写分离配置:
'mysql' =&g
Laravel数据库读写分离配置的方法
10-16
今天小编就为大家分享一篇Laravel数据库读写分离配置的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
评论 1
您还未登录,请先
登录
后发表或查看评论
laravel实现读写分离
不负好时光的博客
08-31
1636
首先我们说一下读写分离的意思吧
查询用一个连接的数据源
添加修改删除用一个数据源 这样可以加快运行效率
接下来我们看一下laravel的配置
打开 config/databasa.php
read 当查询的时候用read
write 当写入的一些操作时
'mysql' => [
/*读写分离*/
...
laravel-读写分离
qq_41952928的博客
05-11
598
可以在config/database.php的中添加一个mysql链接
read项配置的是「读」连接,write项配置的是「写」连接。
'edx_api' => [
'driver' => 'mysql',
'read' => [
'host' => env('DB_HOST', '127.0.0.1'),
'database' => env('...
laravel主从读写分离配置
oschina_41772596的博客
02-24
213
参考链接
在DB的连接工厂中找到以下代码
…/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php
/**
* Get the read configuration for a read / write connection.
* @param array $config
* @return array
*/
protected function getReadConfig(a
laravel配置mysql主从及使用注意
猛犸象
04-17
1654
使用了主从,那么延迟就无法避免,在怎么优化也只是降低可能性而已,终究是会有延迟,既然如此,我们在操作数据库的时候就应该尽量规避出现延迟的情况。
1、避免在同一个会话中对同一张表先写再读,因为读操作去的是从库,在如此小的时间间隔下从库很有可能没同步过来。
2、开启事务之后,此会话的读和写将都去到主库。
3、在业务上,重要的业务单独使用一个主从,避免其他业务的干扰而导致重要业务出现明显延迟,比如下单和...
搭建高性能laravel8+swoole+rabbitmq消息队列+redis集群+mysql主从读写分离
lion的博客
12-28
912
1.登陆服务器
环境:
php:7.3.11
composer:2.0.8
mysql:5.7.27
redis:5.0.5
swoole:
切换composer镜像地址
composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
composer升级到2.0
composer selfupdate -vvv
composer -V
2.安装laravel
composer create-project
laravel技术关键字
程序猿的世界
09-26
167
平时在使用Laravel时,尽管一切东西都可以自己去手动实现,但是真正开发中利用好这些技巧,可以大幅度提升开发效率,代码复用,使代码看起来更优雅
Laravel速查表:https://learnku.com/docs/laravel-cheatsheet/6.0
Laravel API文档:https://laravel.com/api/6.x/index.html
Laravel内助...
redis mysql主从分离_搭建高性能laravel8+swoole+redis集群+mysql主从读写分离
weixin_42499444的博客
01-30
290
搭建高性能laravel8+swoole+redis集群+mysql集群一.laravel+swoole1.laravel8+jwt搭建参考https://blog.csdn.net/xiayu204575/article/details/1117456302. 安装laravel-swoolecomposer require swooletw/laravel-swoole3.发布swoole配...
laravel实现mysql读写分离
qq_38989173的博客
02-25
742
一:作用与目的
1:消除读写的冲突,提高性能
2:提升数据库的并发负载能力
laravel读写分离注意事项
ZiquotZai的博客
02-23
125
先写入代码
'mysql' => [
'read' => [
'host' => [
'192.168.1.1',
'196.168.1.2',
],
],
'write' => [
'host' => [
'196.168.1.3',
],
],
'sticky' => true,
'dr
laravel 读写分离&跨库查询(链接双库)
最新发布
weixin_42905245的博客
08-05
169
随着项目用户量、访问量的增长,对数据库进行读写分离可以有效的提升应用整体性能(目前维护的项目用户量8000W左右,每日活跃用户在500W左右,当然不只是使用读写分离来优化的,不过读写分离的优化也是比较关键的)...
【Laravel】一主多从读写分离配置
花开不败
04-04
7268
错误范例
最近要配置laravel的读写分离,找了半天资料都是类似下面的这种形式。
'mysql' => array(
'read' => array(
'host' => '192.168.1.1',
     'host' => '192.168.1.3',
),
'write' => array(
'host' => '196.16
ThinkPHP laravel 主从复制读写分离配置以及常见问题解决
12-14
框架配置:
分布式数据库必须是相同的数据库类型
首先得配置好mysql主从,可以多主多从
连接的数据库个数取决于hostname定义的数量,所以即使是两个相同的IP也需要重复定义,但是其他的参数如果存在相同的可以不用重复定义
在读写分离的情况下,默认第一个数据库配置是主服务器的配置信息,负责写入数据,如果设置了master_num参数,则可以支持多个主服务器写入
还可以设置slave_no 指定某个服务器进行读操作。
原创文章 1获赞 4访问量 124
关注
Redis如何实现数据库读写分离详解
12-16
前言
Redis是一种NoSQL的文档数据库,通过key-value的结构存储在内存中,Redis读的速度是110000次/s,写的速度是81000次/s,性能很高,使用范围也很广。Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Perl,Object-C,Python,
Laravel数据库读写分离配置
wan353694124的专栏
01-18
2818
Laravel数据库读写分离配置原文链接:http://blog.onlywan.cc/14847498744910.html配置范例'mysql' => [
'driver' => 'mysql',
'write' => [
'host' => '192.168.1.180',
],
'read' => [
laravel数据库读写分离配置
p_ython的博客
08-04
771
转载地址:https://docs.golaravel.com/docs/5.4/database/
laravel框架的读写分离的实现
sclbk的博客
07-24
277
第一步
在laravel框架的database文件里添加配置如下:
'mysql' => [
'read' => [
'host' => '127.0.0.1',
'username' => 'read',
'password' => 'read',
],
'write' => [
'host' => '127.0.0
thinkphp laravel 主从复制读写分离配置
72shmily的博客
08-23
1628
首先thinkphp 有分布式数据库支持
需要做读写分离,根据官方文档配置数据库即可!
官方文档:https://www.kancloud.cn/manual/thinkphp/1733
//分布式数据库配置定义
'DB_DEPLOY_TYPE'=> 1, // 设置分布式数据库支持
'DB_TYPE' =&g
laravel mysql读写分离配置及源码解析
JineD的博客
07-23
9504
参考资料:Laravel 5 配置读写分离和源码分析Laravel 5 配置数据库主从读写分离和源码分析
配置
'mysql' => [
'write' => [
'host' => '127.0.0.1',
'port' => 3306
],
'read' => [
'host' => '127.0.0.1',
'port' => 33
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
互联网俱乐部
CSDN认证博客专家
CSDN认证企业博客
码龄11年
暂无认证
原创
112万+
周排名
114万+
总排名
2万+
访问
等级
275
积分
粉丝
获赞
评论
收藏
私信
关注
热门文章
Laravel 5 配置数据库主从读写分离和源码分析
10319
转-面试前必看:Redis 和 Memcached 的区别
5781
转-Redis和Memcache的区别总结
792
转-Redis常见的性能问题都有哪些?如何解决?
727
转-快找个程序员做老公吧
574
分类专栏
memcache
3篇
redis
4篇
程序人生
2篇
laravel
1篇
mysql
2篇
架构设计
12篇
开涛的博客
11篇
最新评论
Laravel 5 配置数据库主从读写分离和源码分析
raoxiaoya:
总结的很好,但是有一个地方
1,调用方法 DB::table('posts')->selectFromWriteConnection('*')->where('id', $id);
此处的select是sql操作,而不是选择字段吧,应该是sql语句,而不是 * ,例如
DB::select('select * from users where active = ?', [1], false);
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
京东商品详情页服务闭环实践
京东商品详情页碎碎念
使用Nginx+Lua(OpenResty)开发高性能Web应用
2017年21篇
目录
目录
分类专栏
memcache
3篇
redis
4篇
程序人生
2篇
laravel
1篇
mysql
2篇
架构设计
12篇
开涛的博客
11篇
目录
评论 1
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值