Este código fue tomada a partir de ActiveRecord 2.3.14 clase joya ConnectionHandler
establish_connection obras en ActiveRecord
def establish_connection(name, spec)
@connection_pools[name] = ConnectionAdapters::ConnectionPool.new(spec)
end
Parece cada vez rubí llama establish_connection
en el modelo, es la creación de una nueva agrupación de conexiones.
Mi pregunta:
Si tengo 5 modelos que utilizan establish_connection
a la misma base de datos, es lo suficientemente inteligente como rieles para recoger una piscina ya existente en lugar de crear uno nuevo con las mismas credenciales de conexión? ¿Esto también sucede si mis 5 modelos son subclases de alguna clase abstracta que usa establish_connection
? ¿Siempre elegirá una conexión del @connection_pools
si existe?
Actualización 1
Estoy hablando de un ejemplo concreto. Tienes 5 modelos con 5 conexiones diferentes, cada vez que Rails usa un modelo ejecuta establish_connection
. Al observar el código en ActiveRecord, cuando se ejecuta establish_connection
, crea un nuevo grupo con conexiones a esa conexión específica. Lo que me pregunto es si cada vez que Rails llama al modelo establish_connection
, crea un nuevo grupo o toma el existente.
Ejemplo: accede a mi sitio y ve una lista de productos. Acaba de ejecutar una acción que llama al Product.all
, que ejecuta establish_connection
en alguna base de datos en Amazon. Luego, llego a la lista de productos, ¿qué sucede? ¿Cojo la conexión establecida o estoy creando un nuevo grupo con esa conexión?
Actualización 2
Mi conjetura es que los primeros carriles de tiempo cargas mis modelos se crean piscinas con diferentes conexiones. Después, cuando uso algunos Model.method
, simplemente toma la conexión asociada con el modelo y ejecuta el método.
No estoy seguro de qué sucede cuando 2 modelos tienen dos conexiones iguales (no en la clase abstracta sino en la clase propia). ¿Esto producirá dos grupos de conexiones iguales, o ActiveRecord es lo suficientemente inteligente como para detectar este caso?
BTW, muy buena pregunta. – bor1s