Class: ActiveRecord::Middleware::DatabaseSelector
- Inherits:
-
Object
- Object
- ActiveRecord::Middleware::DatabaseSelector
- Defined in:
- lib/active_record/middleware/database_selector.rb,
lib/active_record/middleware/database_selector/resolver.rb,
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, run the provided generator.
bin/rails g active_record:multi_db
This will create a file named config/initializers/multi_db.rb
with the following contents:
Rails.application.configure do
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
Alternatively you can set the options in your environment config or any other config file loaded on boot.
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
Note: If you are using rails new my_app --minimal
you will need to call require "active_support/core_ext/integer/time"
to load the core extension in order to use 2.seconds
Defined Under Namespace
Classes: Resolver
Instance Attribute Summary collapse
-
#context_klass ⇒ Object
readonly
Returns the value of attribute context_klass.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#resolver_klass ⇒ Object
readonly
Returns the value of attribute resolver_klass.
Instance Method Summary collapse
-
#call(env) ⇒ Object
Middleware that determines which database connection to use in a multiple database application.
-
#initialize(app, resolver_klass = nil, context_klass = nil, options = {}) ⇒ DatabaseSelector
constructor
A new instance of DatabaseSelector.
Constructor Details
#initialize(app, resolver_klass = nil, context_klass = nil, options = {}) ⇒ DatabaseSelector
Returns a new instance of DatabaseSelector.
50 51 52 53 54 55 |
# File 'lib/active_record/middleware/database_selector.rb', line 50 def initialize(app, resolver_klass = nil, context_klass = nil, = {}) @app = app @resolver_klass = resolver_klass || Resolver @context_klass = context_klass || Resolver::Session @options = end |
Instance Attribute Details
#context_klass ⇒ Object (readonly)
Returns the value of attribute context_klass.
57 58 59 |
# File 'lib/active_record/middleware/database_selector.rb', line 57 def context_klass @context_klass end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
57 58 59 |
# File 'lib/active_record/middleware/database_selector.rb', line 57 def @options end |
#resolver_klass ⇒ Object (readonly)
Returns the value of attribute resolver_klass.
57 58 59 |
# File 'lib/active_record/middleware/database_selector.rb', line 57 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.
61 62 63 64 65 66 67 |
# File 'lib/active_record/middleware/database_selector.rb', line 61 def call(env) request = ActionDispatch::Request.new(env) select_database(request) do @app.call(env) end end |