日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

yii2 mysql in_yii2 mysql数据库读写分离配置

發布時間:2024/9/27 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 yii2 mysql in_yii2 mysql数据库读写分离配置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

復制和讀寫分離(Replication and Read-Write Splitting)

許多數據庫支持數據庫復制來獲得更好的數據庫可用性, 以及更快的服務器響應時間。通過數據庫復制功能, 數據從所謂的主服務器被復制到從服務器。所有的寫和更新必須發生在主服務器上, 而讀可以發生在從服務器上。

為了利用數據庫復制并且完成讀寫分離, 你可以按照下面的方法來配置?yii\db\Connection?組件:

[

'class' => 'yii\db\Connection',

// 主庫的配置

'dsn' => 'dsn for master server',

'username' => 'master',

'password' => '',

// 從庫的通用配置

'slaveConfig' => [

'username' => 'slave',

'password' => '',

'attributes' => [

// 使用一個更小的連接超時

PDO::ATTR_TIMEOUT => 10,

],

],

// 從庫的配置列表

'slaves' => [

['dsn' => 'dsn for slave server 1'],

['dsn' => 'dsn for slave server 2'],

['dsn' => 'dsn for slave server 3'],

['dsn' => 'dsn for slave server 4'],

],

]

上述的配置指定了一主多從的設置。 這些從庫其中之一將被建立起連接并執行讀操作,而主庫將被用來執行寫操作。 這樣的讀寫分離將通過上述配置自動地完成。比如,

// 使用上述配置來創建一個 Connection 實例

Yii::$app->db = Yii::createObject($config);

// 在從庫中的一個上執行語句

$rows = Yii::$app->db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();

// 在主庫上執行語句

Yii::$app->db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();

信息:?通過調用?yii\db\Command::execute()?來執行的語句都被視為寫操作, 而其他所有通過調用?yii\db\Command?中任一 "query" 方法來執行的語句都被視為讀操作。 你可以通過?Yii::$app->db->slave?來獲取當前有效的從庫連接。

Connection?組件支持從庫間的負載均衡和失效備援, 當第一次執行讀操作時,Connection?組件將隨機地挑選出一個從庫并嘗試與之建立連接, 如果這個從庫被發現為”掛掉的“,將嘗試連接另一個從庫。 如果沒有一個從庫是連接得上的,那么將試著連接到主庫上。 通過配置?server status cache, 一個“掛掉的”服務器將會被記住,因此,在一個 yii\db\Connection::serverRetryInterval 內將不再試著連接該服務器。

信息:?在上面的配置中, 每個從庫都共同地指定了 10 秒的連接超時時間,這意味著,如果一個從庫在 10 秒內不能被連接上,它將被視為“掛掉的”。 你可以根據你的實際環境來調整該參數。

你也可以配置多主多從。例如,

[

'class' => 'yii\db\Connection',

// 主庫通用的配置

'masterConfig' => [

'username' => 'master',

'password' => '',

'attributes' => [

// use a smaller connection timeout

PDO::ATTR_TIMEOUT => 10,

],

],

// 主庫配置列表

'masters' => [

['dsn' => 'dsn for master server 1'],

['dsn' => 'dsn for master server 2'],

],

// 從庫的通用配置

'slaveConfig' => [

'username' => 'slave',

'password' => '',

'attributes' => [

// use a smaller connection timeout

PDO::ATTR_TIMEOUT => 10,

],

],

// 從庫配置列表

'slaves' => [

['dsn' => 'dsn for slave server 1'],

['dsn' => 'dsn for slave server 2'],

['dsn' => 'dsn for slave server 3'],

['dsn' => 'dsn for slave server 4'],

],

]

上述配置指定了兩個主庫和兩個從庫。?Connection?組件在主庫之間,也支持如從庫間般的負載均衡和失效備援。 唯一的差別是,如果沒有主庫可用,將拋出一個異常。

注意:?當你使用?masters?屬性來配置一個或多個主庫時, 所有其他指定數據庫連接的屬性 (例如?dsn,?username,?password) 與?Connection?對象本身將被忽略。

默認情況下,事務使用主庫連接, 一個事務內,所有的數據庫操作都將使用主庫連接,例如,

$db = Yii::$app->db;

// 在主庫上啟動事務

$transaction = $db->beginTransaction();

try {

// 兩個語句都是在主庫上執行的

$rows = $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();

$db->createCommand("UPDATE user SET username='demo' WHERE id=1")->execute();

$transaction->commit();

} catch(\Exception $e) {

$transaction->rollBack();

throw $e;

} catch(\Throwable $e) {

$transaction->rollBack();

throw $e;

}

如果你想在從庫上開啟事務,你應該明確地像下面這樣做:

$transaction = Yii::$app->db->slave->beginTransaction();

有時,你或許想要強制使用主庫來執行讀查詢。 這可以通過?useMaster()?方法來完成:

$rows = Yii::$app->db->useMaster(function($db){

return $db->createCommand('SELECT * FROM user LIMIT 10')->queryAll();

});

你也可以明確地將?Yii::$app->db->enableSlaves?設置為 false 來將所有的讀操作指向主庫連接。

操縱數據庫模式(Working with Database Schema)

Yii DAO 提供了一套完整的方法來讓你操縱數據庫模式, 如創建表、從表中刪除一列,等等。這些方法羅列如下:

這些方法可以如下地使用:

// CREATE TABLE

Yii::$app->db->createCommand()->createTable('post', [

'id' => 'pk',

'title' => 'string',

'text' => 'text',

]);

上面的數組描述要創建的列的名稱和類型。 對于列的類型, Yii 提供了一套抽象數據類型來允許你定義出數據庫無關的模式。 這些將根據表所在數據庫的種類,被轉換為特定的類型定義。 請參考?createTable()-method 的 API 文檔來獲取更多信息。

除了改變數據庫模式, 你也可以通過 DB Connection 的?getTableSchema()?方法來檢索某張表的定義信息。例如,

$table = Yii::$app->db->getTableSchema('post');

該方法返回一個?yii\db\TableSchema?對象, 它包含了表中的列、主鍵、外鍵,等等的信息。 所有的這些信息主要被?query builder?和?active record?所使用,來幫助你寫出數據庫無關的代碼。

總結

以上是生活随笔為你收集整理的yii2 mysql in_yii2 mysql数据库读写分离配置的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。