Class: ActiveRecord::Middleware::DatabaseSelector

Inherits:
Object
  • Object
show all
Defined in:
activerecord/lib/active_record/middleware/database_selector.rb,
activerecord/lib/active_record/middleware/database_selector/resolver.rb,
activerecord/lib/active_record/middleware/database_selector/resolver/session.rb

Overview

The DatabaseSelector Middleware provides a framework for automatically swapping from the primary to the replica database connection. Rails provides a basic framework to determine when to swap and allows for applications to write custom strategy classes to override the default behavior.

The resolver class defines when the application should switch (i.e. read from the primary if a write occurred less than 2 seconds ago) and a resolver context class that sets a value that helps the resolver class decide when to switch.

Rails default middleware uses the request's session to set a timestamp that informs the application when to read from a primary or read from a replica.

To use the DatabaseSelector in your application with default settings add the following options to your environment config:

# This require is only necessary when using `rails new app --minimal`
require "active_support/core_ext/integer/time"

class Application < Rails::Application
  config.active_record.database_selector = { delay: 2.seconds }
  config.active_record.database_resolver = ActiveRecord::Middleware::DatabaseSelector::Resolver
  config.active_record.database_resolver_context = ActiveRecord::Middleware::DatabaseSelector::Resolver::Session
end

New applications will include these lines commented out in the production.rb.

The default behavior can be changed by setting the config options to a custom class:

config.active_record.database_selector = { delay: 2.seconds }
config.active_record.database_resolver = MyResolver
config.active_record.database_resolver_context = MyResolver::MySession

Defined Under Namespace

Classes: Resolver

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(app, resolver_klass = nil, context_klass = nil, options = {}) ⇒ DatabaseSelector

Returns a new instance of DatabaseSelector.


43
44
45
46
47
48
# File 'activerecord/lib/active_record/middleware/database_selector.rb', line 43

def initialize(app, resolver_klass = nil, context_klass = nil, options = {})
  @app = app
  @resolver_klass = resolver_klass || Resolver
  @context_klass = context_klass || Resolver::Session
  @options = options
end

Instance Attribute Details

#context_klassObject (readonly)

Returns the value of attribute context_klass


50
51
52
# File 'activerecord/lib/active_record/middleware/database_selector.rb', line 50

def context_klass
  @context_klass
end

#optionsObject (readonly)

Returns the value of attribute options


50
51
52
# File 'activerecord/lib/active_record/middleware/database_selector.rb', line 50

def options
  @options
end

#resolver_klassObject (readonly)

Returns the value of attribute resolver_klass


50
51
52
# File 'activerecord/lib/active_record/middleware/database_selector.rb', line 50

def resolver_klass
  @resolver_klass
end

Instance Method Details

#call(env) ⇒ Object

Middleware that determines which database connection to use in a multiple database application.


54
55
56
57
58
59
60
# File 'activerecord/lib/active_record/middleware/database_selector.rb', line 54

def call(env)
  request = ActionDispatch::Request.new(env)

  select_database(request) do
    @app.call(env)
  end
end