BLOG ENTRY

CakePHP1.2でMySQLレプリケーション[CakePHP]

Cakephp1.2でMySQLレプリケーションを使う場合はこんな感じでやればいけました。

こちらの記事を参考にさせて頂きました。ありがとうございます。
MySQLレプリケーションでのCakephp1.2でのDBホスト接続先の分岐処理の流れはこんな感じらしいです。

常にスレーブ接続
↓↓
更新クエリ実行前にマスターに接続
↓↓
更新クエリ実行
↓↓
更新クエリ実行後、スレーブに接続を戻す
↓↓
また常にスレーブ接続

おおまかにはこんな感じです。
で、書くコード量はというとすごく少ないです。2ファイルさわるだけ。

1.DB設定ファイルにマスターとホストの接続先を書く

app/config/database.php
[php]
class DATABASE_CONFIG {
var $master = array( // as MySQL master server
‘driver’ => ‘mysql’,
‘persistent’ => false,
‘host’ => ‘マスターのホスト’,
‘port’ => ”,
‘login’ => ‘ユーザー名’,
‘password’ => ‘パスワード’,
‘database’ => ‘DB名’,
‘schema’ => ”,
‘prefix’ => ”,
‘encoding’ => ‘utf8’
);

var $default = array( // as MySQL slave server
‘driver’ => ‘mysql’,
‘persistent’ => false,
‘host’ => ‘スレイブのホスト’,
‘port’ => ”,
‘login’ => ‘ユーザー名’,
‘password’ => ‘パスワード’,
‘database’ => ‘DB名’,
‘schema’ => ”,
‘prefix’ => ”,
‘encoding’ => ‘utf8’
);
[/php]

2.で、更新系クエリを各モデル共通ファイルでオーバーライド。

app/app_model.php
[php]
<?php
/*——————

更新系クエリ時にのみ
masterへ接続し、クエリ実行後、元に戻す

——————–*/
class AppModel extends Model {

function save($data = null, $validate = true, $fieldList = array()) {
$oldDb = $this->useDbConfig;
$this->setDataSource(‘master’);
$return = parent::save($data, $validate, $fieldList);
$this->setDataSource($oldDb);
return $return;
}

function updateAll($fields, $conditions = true) {
$oldDb = $this->useDbConfig;
$this->setDataSource(‘master’);
$return = parent::updateAll($fields, $conditions);
$this->setDataSource($oldDb);
return $return;
}

function delete($id = null, $cascade = true) {
$oldDb = $this->useDbConfig;
$this->setDataSource(‘master’);
$return = parent::delete($id, $cascade);
$this->setDataSource($oldDb);
return $return;
}

function deleteAll($conditions, $cascade = true, $callbacks = false) {
$oldDb = $this->useDbConfig;
$this->setDataSource(‘master’);
$return = parent::deleteAll($conditions, $cascade, $callbacks);
$this->setDataSource($oldDb);
return $return;
}
}
[/php]

これだけみたいです。

app/app_model.phpがうまくスケーラビリティしてくれるのはCakephpのコード規約に沿ってクエリ処理を書いた場合。
独自SQL文を書いた場合は、このメソッドを通らないので、常にスレーブへクエリを実行してしまいます。
なので、その場合はこんな感じでマスター側を指定してやります。

モデルの場合、

[php]
$sql = ‘delete from users’; //仮SQL
$oldDb = $this->useDbConfig;
$this->setDataSource(‘master’);
$this->query($sql);
$this->setDataSource($oldDb);
[/php]

こんな感じで接続ホストを切り替えると。
コントローラーの場合、

[php]
$sql = ‘delete from users’; //仮SQL
$oldDb = $this->User->useDbConfig;
$this->User->setDataSource(‘master’);
$this->User->query($sql);
$this->User->setDataSource($oldDb);
[/php]

こんな感じで動きました。

  • name:今週の管理人Bookmark (7/12-7/19) - ElectronicBrain is eating BreakFast
  • date:2009/07/19
  • […] CakePHP1.2でMySQLレプリケーション[CakePHP] | Web&MUSICブログ QUALL […]

  • type:ピンバック [ ]

    WRITE COMMENT


    (required)


    (required)


    (required)

    MENU

    veltica creative of twitter