Active Record和涉及多个dbs的多线程

时间:2012-11-28 05:43:28

标签: ruby-on-rails activerecord

我有一个多宿主的Rails应用程序。

foo.mysite.com与“foo”db对话。

bar.mysite.com与“bar”db对话。

这是通过致电:

来完成的

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同时使用ActiveRecord::Base.connection与db2通信?

1 个答案:

答案 0 :(得分:-1)

我建议使用Postgres和单独的模式,而不是完全单独的数据库;那是你可以共享游泳池。

用法如下:select * from foo.usersselect * from bar.users

您可以将模式作为参数传递给后台工作程序。