Class: ActiveRecord::Middleware::DatabaseSelector
Relationships & Source Files | |
Inherits: | Object |
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 ::ActiveRecord::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:
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
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
Class Method Summary
Instance Attribute Summary
- #context_klass readonly
- #options readonly
- #resolver_klass readonly
Instance Method Summary
-
#call(env)
::ActiveRecord::Middleware
that determines which database connection to use in a multiple database application.
Constructor Details
.new(app, resolver_klass = nil, context_klass = nil, options = {}) ⇒ DatabaseSelector
# File 'activerecord/lib/active_record/middleware/database_selector.rb', line 38
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 (readonly)
[ GitHub ]# File 'activerecord/lib/active_record/middleware/database_selector.rb', line 45
attr_reader :resolver_klass, :context_klass, :
#options (readonly)
[ GitHub ]# File 'activerecord/lib/active_record/middleware/database_selector.rb', line 45
attr_reader :resolver_klass, :context_klass, :
#resolver_klass (readonly)
[ GitHub ]# File 'activerecord/lib/active_record/middleware/database_selector.rb', line 45
attr_reader :resolver_klass, :context_klass, :
Instance Method Details
#call(env)
::ActiveRecord::Middleware
that determines which database connection to use in a multiple database application.
# File 'activerecord/lib/active_record/middleware/database_selector.rb', line 49
def call(env) request = ActionDispatch::Request.new(env) select_database(request) do @app.call(env) end end