2012-11-28 42 views
4

我有一個多宿主的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

回答

-1

我會推薦使用Postgres和單獨的模式,而不是完全獨立的數據庫;那是你可以共享池。

使用會是什麼樣子:select * from foo.usersselect * from bar.users

而且你會的模式傳遞給你的後臺工作作爲參數。