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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

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

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

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

許多數(shù)據(jù)庫支持?jǐn)?shù)據(jù)庫復(fù)制來獲得更好的數(shù)據(jù)庫可用性, 以及更快的服務(wù)器響應(yīng)時間。通過數(shù)據(jù)庫復(fù)制功能, 數(shù)據(jù)從所謂的主服務(wù)器被復(fù)制到從服務(wù)器。所有的寫和更新必須發(fā)生在主服務(wù)器上, 而讀可以發(fā)生在從服務(wù)器上。

為了利用數(shù)據(jù)庫復(fù)制并且完成讀寫分離, 你可以按照下面的方法來配置?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'],

],

]

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

// 使用上述配置來創(chuàng)建一個 Connection 實例

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

// 在從庫中的一個上執(zhí)行語句

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

// 在主庫上執(zhí)行語句

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

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

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

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

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

[

'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?組件在主庫之間,也支持如從庫間般的負(fù)載均衡和失效備援。 唯一的差別是,如果沒有主庫可用,將拋出一個異常。

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

默認(rèn)情況下,事務(wù)使用主庫連接, 一個事務(wù)內(nèi),所有的數(shù)據(jù)庫操作都將使用主庫連接,例如,

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

// 在主庫上啟動事務(wù)

$transaction = $db->beginTransaction();

try {

// 兩個語句都是在主庫上執(zhí)行的

$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;

}

如果你想在從庫上開啟事務(wù),你應(yīng)該明確地像下面這樣做:

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

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

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

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

});

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

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

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

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

// CREATE TABLE

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

'id' => 'pk',

'title' => 'string',

'text' => 'text',

]);

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

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

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

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。