Понимание того, как create_connection работает в ActiveRecord - PullRequest
32 голосов
/ 25 августа 2011

Этот код был взят из класса драгоценных камней ActiveRecord 2.3.14 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 достаточно умен, чтобы поймать это дело?

Ответы [ 3 ]

15 голосов
/ 20 сентября 2011

AR вызывает create_connection только один раз, для ActiveRecord :: Base.Все подклассы используют одно соединение.

Вы можете вручную установить соединение самостоятельно на некоторых подклассах.Это очень удобно для одновременного использования двух баз данных, например,

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

Вы не можете выполнять запросы, которые пересекают базы данных.

9 голосов
/ 25 августа 2011

Вам действительно не нужно звонить establish_connection по каждой модели.Вы можете просто сделать следующее:

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

и у вас будет доступ к соединению.(Этот кусок кода был извлечен из реального кода (кроме имени базы данных :))).Но в соответствии с API я думаю, что Rails не берет существующее соединение из другой модели (поправьте меня, если я ошибаюсь).Также здесь есть ссылка на документацию .Вы можете прочитать больше о связи там.Я надеюсь, что помог вам немного.

2 голосов
/ 14 сентября 2011

Комментарий:

# 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.

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

Должен объяснить ситуацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...