yii连接mysql主从_Connection 数据库主从连接源码剖析

9c5c114a4da79cc9b874ac24b780fa6b.png

连接总体流程

随机打乱从库配置(master可以选择是否打乱,slave一定会打乱;如果master没有配置数组则直接使用$dsn和$username作为master的配置,也就是一主)

遍历配置如果该库的配置在serverStatusCache缓存中生效则说明过期时间内该配置不可用,直接continue

如果缓存无值则去实例化PDO(会新实例化一个类$db = Yii::createObject($config))

实例化PDO记录info日志

记录实例化性能分析日志(可选,根据$enableProfiling)

new PDO

设置PDO的ATTR_ERRMODE、ATTR_EMULATE_PREPARES、字符集属性

执行afterOpen事件

实例化失败记录serverStatusCache缓存,标识该配置600秒(默认)内不可用

master与slave连接的差异

slave连接会先判断是否可以使用slave从库($this->enableSlaves)

slave如果连接不上会判断是否进而连接master

一定会打乱slave配置数组

如果没有master配置数组,则直接使用$this->dns和$this->root

master连接可以选择是否打乱配置数组

涉及方法

getSlavePdo($fallbackToMaster = true),会调用getSlave(false),如果从库连不上就去连接master(根据参数$fallbackToMaster),返回的是PDO类

getSlave($fallbackToMaster = true),会调用openFromPool,从slave配置数组中随机连接一个slave,返回的是Connection类

getMasterPdo(),会调用open(),如果master配置数据为空则直接使用$dns进行连接,如果master配置数组不为空则遍历连接master,返回PDO类

getMaster(),遍历连接master,返回Connection类

openFromPool(array $pool, array $sharedConfig),随机打乱配置信息

openFromPoolSequentially(array $pool, array $sharedConfig),不随机打乱配置信息,遍历配置信息,连接PDO;内部还有serverStatusCache去缓存服务器可用状态

open(),连接master或者slave,会记录info和Profiling日志(可选)

createPdoInstance(),实例化PDO

属性注入

因为Connection继承Component类,可以使用属性注入,所以

$db->master; //和$db->getMaster();一样

$db->slave; //和$db->getSlave();一样

$db->masterPdo; //和$db->getMasterPdo();一样

$db->slavePdo; //和$db->getSlavePdo();一样

源码细节

yii2中可以配置一主多从配置,在连接从库方面数据库配置如下

public function actionD(){

$db = new \yii\db\Connection([

'dsn' => 'mysql:host=192.168.124.10;dbname=test',

'username' => 'root',

'password' => '',

'charset' => 'utf8',

'enableSlaves'=>true, //可以使用从库

'serverRetryInterval'=>600, //其中一个从库配置不可用,将缓存不可用状态600秒

'enableProfiling'=>true, //默认配置,将记录连接数据库、执行语句等的性能分析日志

'emulatePrepare'=>true, //true为开启本地模拟prepare

'slaveConfig'=>[ //从库slaves属性通用配置

'username' => 'root',

'password' => '',

'attributes' => [

PDO::ATTR_TIMEOUT => 10,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值