此代码取自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时,它仅获取与模型关联的连接并执行该方法。

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

最佳答案

您实际上不必在每个模型上都调用establish_connection。您可以直接执行以下操作:

ActiveRecord::Base.establish_connection(
 { :adapter => 'mysql2',
   :database => 'some_database',
   :host => 'localhost',
   :username => 'root',
   :password => "" }
)

您将可以访问连接。 (此代码块已从真实代码中提取(数据库名称:)除外)。
但是根据API,我认为Rails不会采用其他模型的现有连接(如果我错了,请纠正我)。
这也是link to documentation。您可以在此处了解有关连接的更多信息。希望我能帮到你。

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

10-12 07:33
查看更多