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
版權聲明:著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請保留以上作者信息和原文鏈接。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章