おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

FreshConnectionをRails3に対応させました

FreshConnectionのバージョン0.1.0 を作成しました。

https://github.com/tsukasaoishi/fresh_connection/tree/v0.1.0

今回のバージョンから、Rails2は対象外になっているので注意してください。
今までのバージョンと以下の点が変更になっています。

* Rails3対応
* master_clear_connectionのデフォルト値をfalseに変更
* slaveにアクセスしたとき、ログの先頭に slave という表記を追加。今までの masterの表記は廃止

config/database.ymlの設定は過去のバージョンと同様です。前回までのバージョンではrack middlewareの設定が必要でしたが、今バージョンよりそれは不要になっています。railtieで自動的にrackに詰むようにしています。基本的には、Gemfileにfresh_connctionを追加するだけで一通りの機能を使えます。

以下のようなアクションがあった場合、

  def tsu  
    Article.includes(:article_content).first  

    Article.transaction do  
      Article.find_by_id(1)  
    end  

    Article.where(:id => 100).includes(:article_content).readonly(false).first  
    render :text => "ok"  
  end  

Railsログは以下のようになります。

  [slave] Article Load (0.2ms)  SELECT `articles`.* FROM `articles` LIMIT 1  
  [slave] ArticleContent Load (0.2ms)  SELECT `article_contents`.* FROM `article_contents` WHERE `article_contents`.`article_id` IN (1)  
   (0.2ms)  BEGIN  
  Article Load (0.3ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`id` = 1 LIMIT 1  
   (0.1ms)  COMMIT  
  Article Load (0.1ms)  SELECT `articles`.* FROM `articles` WHERE `articles`.`id` = 100 LIMIT 1  
  ArticleContent Load (0.1ms)  SELECT `article_contents`.* FROM `article_contents` WHERE `article_contents`.`article_id` IN (100)  

MySQLのクエリログは以下のようになります。

131207 22:32:08   170 Connect   root@localhost on kaeruspoon_development  
                  170 Query     SET SQL_AUTO_IS_NULL=0, @@wait_timeout = 2147483  
                  170 Query     SELECT  `articles`.* FROM `articles`  LIMIT 1  
                  170 Query     SELECT `article_contents`.* FROM `article_contents`  WHERE `article_contents`.`article_id` IN (1)  
                  168 Query     BEGIN  
                  168 Query     SELECT  `articles`.* FROM `articles`  WHERE `articles`.`id` = 1 LIMIT 1  
                  168 Query     COMMIT  
                  168 Query     SELECT  `articles`.* FROM `articles`  WHERE `articles`.`id` = 100 LIMIT 1  
                  168 Query     SELECT `article_contents`.* FROM `article_contents`  WHERE `article_contents`.`article_id` IN (100)  
                  170 Quit  

期待通りに動作しています。