这段代码摘自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` 连接到亚马逊上的某个数据库。然后,我来到产品列表,会发生什么?我会获取已建立的连接还是会创建一个新的连接池?
更新2:
我的猜测是,第一次 Rails 加载我的模型时,它会创建具有不同连接的连接池。随后,当我使用一些 `Model.method` 时,它只需获取与该模型相关联的连接并执行该方法。
我不确定当两个模型具有相等的连接时会发生什么情况(不在抽象类中而是在自身类中)。这是否会产生两个相同的连接池,或者 ActiveRecord 足够聪明以捕获此情况?