我有一个多宿主的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通信?
答案 0 :(得分:-1)
我建议使用Postgres和单独的模式,而不是完全单独的数据库;那是你可以共享游泳池。
用法如下:select * from foo.users
,select * from bar.users
您可以将模式作为参数传递给后台工作程序。