连接总体流程
随机打乱从库配置(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,