我有一個多宿主的Rails應用程序。活動記錄和涉及多個dbs的多線程
foo.mysite.com
與「foo」db對話。
bar.mysite.com
與「bar」db的對話。
這是通過調用來完成:
ActiveRecord::Base.connection_handler.establish_connection("ActiveRecord::Base", foo_spec)
當請求進來FOO它使用foo_spec,當請求進來吧,它使用的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
?