跳至內文 跳至搜尋

資料庫選擇器中間件

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