FreshConnectionをRails3に対応させました

Tsukasa OISHI

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

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