Skip to content
ActiveRecord connection proxy for master/slave connections
Find file
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.



The masochism plugin provides an easy solution for Ruby on Rails applications to
work in a replicated database environment. Connection proxy sends some database
queries (those in a transaction, update statements, and ActiveRecord::Base#reload) 
to a master database, and the rest to the slave database. 

The ActiveReload::MasterDatabase model uses a 'master_database' setting that
can either be defined for all of your environments, or for each environment as
a nested declaration.

The ActiveReload::SlaveDatabase model uses a 'slave_database' setting that
can only be defined per environment.

Example declarations:

  # config/database.yml
  login: &login
    adapter: postgresql
    host: localhost
    port: 5432

    database: production_slave_database_name
    <<: *login

    database: production_master_database_name
    <<: *login

    database: staging_database_name
    host: slave-db-pool.local
    <<: *login
      database: staging_database_name
      host: master-db-server.local
      <<: *login

    database: qa_master_database_name
    host: qa-master
    <<: *login
      database: qa_slave_database_name
      host: qa-slave
      <<: *login

  development: # Does not use masochism
    database: development_database_name
    <<: *login

To setup:

Whether you want this in production only, or maybe just your deployment server, 
is up to you. Just call the following method in your desired environment file.


Some suggestions:

  * in a config/initializer
  * config.after_initialize block

If you are using the Litespeed web server, child processes are initialized on 
creation, which means any setup done in an environment file will be effectively 
ignored. A brief discussion of the problem is posted here:

One solution for Litespeed users is to check the connection at your first request
and do the setup! call if your connection hasn't been initialized, like:

class ApplicationController < ActionController::Base
  prepend_before_filter do |controller|
    ActiveReload::ConnectionProxy.setup! unless ActiveRecord::Base.connection.is_a? ActiveReload::ConnectionProxy

If you want a model to always use the Master database, you can inherit 
ActiveRelaod::MasterDatabase.  Any models with their own database connection
will not be affected.

Setting up your own proxies:

  # Sets up MyMaster's connection as the master database connection for User.
  ActiveReload::ConnectionProxy.setup_for MyMaster, User
Using the MasterFilter class is quite simple. If you have any actions you know require 
the Master DB for both reads and writes simply do the following:

class RandomController < ApplicationController
  around_filter ActiveReload::MasterFilter, :only => [:show, :edit, :update]
Something went wrong with that request. Please try again.