4

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

4

1 回答 1

-1

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

用法看起来像:select * from foo.users,select * from bar.users

您会将模式作为参数传递给您的后台工作人员。

于 2014-10-23T20:53:03.850 回答