gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:44:51 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com