Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 涉及多个数据库的活动记录和多线程_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on 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,它是多线程的

我有一个多宿主的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
,它是多线程的

我在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

然后将模式作为参数传递给后台工作人员