マルチホームのRailsアプリがあります。
foo.mysite.com
「foo」データベースと通信します。
bar.mysite.com
「バー」データベースと話します。
これは、次の呼び出しによって実現されます。
ActiveRecord::Base.connection_handler.establish_connection("ActiveRecord::Base", foo_spec)
リクエストが foo に来るときは foo_spec を使用し、リクエストが bar に来るときは bar_spec を使用します。
すべてが幸せで、世界は平和です。
でも、
私も使用しますsidekiq
。マルチスレッド化が進んでいます。
sidekiq で奇妙な動作が発生していました。foo_db と話していると思ったら、しばしば bar_dbActiveRecord::Base.connection
を指していました。
コードを掘り下げたところ、次のことがわかりました。
def retrieve_connection_pool(klass)
pool = @class_to_pool[klass.name]
return pool if pool
return nil if ActiveRecord::Base == klass
retrieve_connection_pool klass.superclass
end
AR の内部設計では、AR::Base は単一の接続プールについてしか認識できないことがわかりました。
を使用して、スレッド 1 が db1 と通信し、スレッド 2 が同時に db2 と通信する方法はありますActiveRecord::Base.connection
か?