我有一个多宿主的 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 交谈时,ActiveRecord::Base.connection
被指向 bar_db。
我深入研究了代码,发现:
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
?