gpt4 book ai didi

ruby-on-rails - 了解 establish_connection 在 ActiveRecord 中的工作原理

转载 作者:数据小太阳 更新时间:2023-10-29 06:24:55 24 4
gpt4 key购买 nike

此代码取自 ActiveRecord 2.3.14 的 gem 类 ConnectionHandler

def establish_connection(name, spec)
@connection_pools[name] = ConnectionAdapters::ConnectionPool.new(spec)
end

似乎每次 ruby​​ 在模型上调用 establish_connection 时,它都会创建一个新的连接池。

我的问题:

如果我有 5 个模型使用 establish_connection 连接到同一个数据库,Rails 是否足够智能以选择一个已经存在的池而不是创建一个具有相同连接凭据的新池?如果我的 5 个模型是某个使用 establish_connection 的抽象类的子类,是否也会发生这种情况?它是否总是从 @connection_pools 中选择一个连接(如果它存在)?

更新 1

我说的是一个具体的例子。您有 5 个模型和 5 个不同的连接,每次 Rails 使用模型时,它都会执行 establish_connection。查看 ActiveRecord 中的代码,当它执行 establish_connection 时,它会创建一个新池,其中包含到该特定连接的连接。我想知道的是,每次 Rails 调用模型的 establish_connection 时,它是创建一个新池还是使用现有池。

示例:您访问我的网站并查看产品列表。您刚刚点击了一个调用 Product.all 的操作,它执行 establish_connection 到 Amazon 上的某个数据库。然后,我来到产品列表,会发生什么?我是获取已建立的连接还是使用该连接创建一个新池?

更新 2

我的猜测是,Rails 第一次加载我的模型时,它会创建具有不同连接的池。之后,当我使用一些 Model.method 时,它只是获取与模型关联的连接并执行该方法。

我不确定当 2 个模型有两个相等的连接时会发生什么(不是在抽象类中,而是在自身类中)。这会产生两个相同的连接池吗,或者 ActiveRecord 是否足够智能以捕捉这种情况?

最佳答案

AR 只为 ActiveRecord::Base 调用一次 establish_connection。所有子类都使用一个连接。

您可以在某些子类上自己手动调用建立连接。这对于同时使用两个数据库非常方便,例如

class MyMainUser < ActiveRecord::Base; end 
class MyOtherDb < ActiveRecord::Base; end
class MyOtherUser < MyOtherDb; end

MyOtherDb.establish_connection ...

MyMainUser.first # uses default db
MyOtherUser.first # uses other db

不过,您不能进行跨数据库的查询。

关于ruby-on-rails - 了解 establish_connection 在 ActiveRecord 中的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7191139/

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