数据库选择器中间件
该 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