ruby-on-rails - Active Record 和涉及多个数据库的多线程

标签 ruby-on-rails activerecord

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

最佳答案

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

用法如下:select * from foo.users , select * from bar.users
并且您会将架构作为参数传递给您的后台工作人员。

关于ruby-on-rails - Active Record 和涉及多个数据库的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13598583/

相关文章:

javascript - rails : displaying a value dynamically calculated in my form

ruby-on-rails - 无法连接到Geckodriver

mysql - 连接两个表时检索所有数据并按项目计数

sql - Rails HABTM 查询——带有所有标签的文章

mysql - 在 Rails 3.2.13 应用程序中,我错误地生成了索引

ruby-on-rails - belongs_to 关联栏中的组函数

css - 如何只从 Sass 样式表导入变量和混合?

ruby-on-rails - FactoryGirl 制作不适用于功能测试

ruby-on-rails - 带有智能重定向的 StackOverflow 风格路由

ruby-on-rails - 从延迟加载的模型中获取事件记录关系