Pregunta Comprender cómo funciona connect_connection en ActiveRecord


Este código fue tomado de la clase de gemas de ActiveRecord 2.3.14 ConnectionHandler

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

Parece que cada vez que Ruby llama establish_connection en el modelo, está creando un nuevo grupo de conexiones.

Mi pregunta:

Si tengo 5 modelos que usan establish_connection En la misma base de datos, ¿Rails es lo suficientemente inteligente como para elegir un grupo 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 utiliza establish_connection? ¿Siempre elegirá una conexión de la @connection_pools ¿si existiera?

Actualización 1

Estoy hablando de un ejemplo concreto. Tienes 5 modelos con 5 conexiones diferentes, cada vez que Rails usa un modelo que ejecuta establish_connection. Mirando 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 a un modelo establish_connection, crea un nuevo conjunto o toma el existente.

Ejemplo: vienes a mi sitio y ves una lista de productos. Acaba de golpear una acción que llama Product.all, que ejecuta establish_connection a 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

Supongo que la primera vez que Rails carga mis modelos crea pools 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 propia clase). ¿Esto producirá dos grupos de conexiones iguales, o ActiveRecord es lo suficientemente inteligente como para detectar este caso?


32
2017-08-25 13:24


origen


Respuestas:


Realmente no tienes que llamar establish_connection en cada modelo. Simplemente puede hacer lo siguiente:

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

y tendrás acceso a la conexión. (Este fragmento de código se ha extraído del código real (excepto el nombre de la base de datos :))).
Pero de acuerdo con la API, creo que Rails no toma la conexión existente de otro modelo (corrígeme si estoy equivocado).
También aquí hay un enlace a la documentación. Puede leer más sobre la conexión allí.
 Espero haberte ayudado un poco.


8
2017-08-25 14:02



AR llama a establish_connection solo una vez, para ActiveRecord :: Base. Todas las subclases usan una conexión.

Puede llamar manualmente para establecer la conexión usted mismo en algunas subclases. Esto es muy conveniente para usar dos bases de datos a la vez, p.

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

Sin embargo, no puede hacer consultas que crucen bases de datos.


14
2017-09-20 04:57



Este comentario:

# Check-out a database connection from the pool, indicating that you want
# to use it. You should call #checkin when you no longer need this.
#
# This is done by either returning an existing connection, or by creating
# a new connection. If the maximum number of connections for this pool has
# already been reached, but the pool is empty (i.e. they're all being used),
# then this method will wait until a thread has checked in a connection.
# The wait time is bounded however: if no connection can be checked out
# within the timeout specified for this pool, then a ConnectionTimeoutError
# exception will be raised.

de: https://github.com/rails/rails/blob/dd944cbf5879e675fff541d1be7c7eb6c3382d01/activerecord/lib/active_record/connection_adapters/abstract/connection_pool.rb#L242-251

Debería explicar la situación


2
2017-09-14 18:48