
Cakephp1.2でMySQLレプリケーションを使う場合はこんな感じでやればいけました。
こちらの記事を参考にさせて頂きました。ありがとうございます。
MySQLレプリケーションでのCakephp1.2でのDBホスト接続先の分岐処理の流れはこんな感じらしいです。
常にスレーブ接続
↓↓
更新クエリ実行前にマスターに接続
↓↓
更新クエリ実行
↓↓
更新クエリ実行後、スレーブに接続を戻す
↓↓
また常にスレーブ接続
おおまかにはこんな感じです。
で、書くコード量はというとすごく少ないです。2ファイルさわるだけ。
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
/*------------------
更新系クエリ時にのみ
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;
}
}
これだけみたいです。
app/app_model.phpがうまくスケーラビリティしてくれるのはCakephpのコード規約に沿ってクエリ処理を書いた場合。
独自SQL文を書いた場合は、このメソッドを通らないので、常にスレーブへクエリを実行してしまいます。
なので、その場合はこんな感じでマスター側を指定してやります。
モデルの場合、
$sql = 'delete from users'; //仮SQL
$oldDb = $this->useDbConfig;
$this->setDataSource('master');
$this->query($sql);
$this->setDataSource($oldDb);
こんな感じで接続ホストを切り替えると。
コントローラーの場合、
$sql = 'delete from users'; //仮SQL
$oldDb = $this->User->useDbConfig;
$this->User->setDataSource('master');
$this->User->query($sql);
$this->User->setDataSource($oldDb);
こんな感じで動きました。
[...] CakePHP1.2でMySQLレプリケーション[CakePHP] | Web&MUSICブログ QUALL [...]
type:ピンバック [ ]