数据库选择器中间件
DatabaseSelector
Middleware
为自动从主数据库连接切换到副本数据库连接提供了一个框架。Rails 提供了一个基本框架来确定何时切换,并允许应用程序编写自定义策略类来覆盖默认行为。
解析器类定义了应用程序应该切换的时间(即,如果 2 秒前发生过写入,则从主数据库读取),以及一个解析器上下文类,该类设置一个值来帮助解析器类决定何时切换。
Rails 默认中间件使用请求的会话来设置一个时间戳,该时间戳通知应用程序何时从主数据库读取或从副本数据库读取。
要在应用程序中使用具有默认设置的 DatabaseSelector
,请运行提供的生成器。
$ bin/rails g active_record:multi_db
这将创建一个名为 config/initializers/multi_db.rb
的文件,其中包含以下内容
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
或者,你可以在环境配置或引导时加载的任何其他配置文件中设置选项。
可以通过将配置选项设置为自定义类来更改默认行为
config.active_record.database_selector = { delay: 2.seconds }
config.active_record.database_resolver = MyResolver
config.active_record.database_resolver_context = MyResolver::MySession
注意:如果你正在使用 rails new my_app --minimal
,则需要调用 require "active_support/core_ext/integer/time"
来加载核心扩展才能使用 2.seconds
方法
属性
[R] | context_klass | |
[R] | options | |
[R] | resolver_klass |
类公共方法
new(app, resolver_klass = nil, context_klass = nil, options = {}) 链接
源代码:显示 | 在 GitHub 上
# File activerecord/lib/active_record/middleware/database_selector.rb, line 52 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
实例公共方法
call(env) 链接
Middleware
用于确定在多数据库应用程序中使用哪个数据库连接。
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/middleware/database_selector.rb, line 63 def call(env) request = ActionDispatch::Request.new(env) select_database(request) do @app.call(env) end end