跳至内容 跳至搜索

数据库选择中间件

The 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

Attributes

[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