Ruby on rails 涉及多个数据库的活动记录和多线程
我有一个多宿主的Rails应用程序Ruby on rails 涉及多个数据库的活动记录和多线程,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个多宿主的Rails应用程序 foo.mysite.com与“foo”数据库对话 bar.mysite.com与“bar”数据库对话 这可以通过调用: ActiveRecord::Base.connection\u handler.build\u connection(“ActiveRecord::Base”,foo\u spec) 当请求传入foo时,它使用foo_规范;当请求传入bar时,它使用bar_规范 一切都是幸福的,世界是和平的 但是, 我还使用了sidekiq,它是多线程的
foo.mysite.com
与“foo”数据库对话
bar.mysite.com
与“bar”数据库对话
这可以通过调用:
ActiveRecord::Base.connection\u handler.build\u connection(“ActiveRecord::Base”,foo\u spec)
当请求传入foo时,它使用foo_规范;当请求传入bar时,它使用bar_规范
一切都是幸福的,世界是和平的
但是,
我还使用了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了解单个连接池
使用
ActiveRecord::Base.connection
,有没有办法让线程1与db1对话,线程2同时与db2对话 我建议使用Postgres和单独的模式,而不是完全使用单独的数据库;那就是你可以共享池
用法如下:select*from foo.users
,select*from bar.users
然后将模式作为参数传递给后台工作人员