我有一个多宿主的 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
?
最佳答案
我建议使用 Postgres 和单独的模式,而不是完全单独的数据库;那是你可以共享池。
用法如下:select * from foo.users
, select * from bar.users
并且您会将架构作为参数传递给您的后台工作人员。
关于ruby-on-rails - Active Record 和涉及多个数据库的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13598583/