跳至内容 跳至搜索

数据库选择器中间件

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

方法
C
N

属性

[R] context_klass
[R] options
[R] resolver_klass

类公共方法

new(app, resolver_klass = nil, context_klass = nil, options = {})

# 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 确定在多个数据库应用程序中使用哪个数据库连接。

# 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