Fetching latest commit…
Cannot retrieve the latest commit at this time.
|Failed to load latest commit information.|
masochism ========= 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 production: database: production_slave_database_name <<: *login master_database: database: production_master_database_name <<: *login staging: database: staging_database_name host: slave-db-pool.local <<: *login master_database: database: staging_database_name host: master-db-server.local <<: *login qa: database: qa_master_database_name host: qa-master <<: *login slave_database: 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. ActiveReload::ConnectionProxy.setup! 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: http://litespeedtech.com/support/wiki/doku.php?id=litespeed_wiki:rails:memcache 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 end ... end 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] ... end