Как использовать ActiveRecord :: Base.connection при использовании raw sql? - PullRequest
0 голосов
/ 26 июня 2019

Добавить соединение выполнить в модели

def self.execute_sql(*sql_array)
  connection.execute(send(:sanitize_sql_array, sql_arry))
end

Как закрыть соединение в этом случае? Это хороший способ?

def self.close_connection
  connection.close
end

Кстати, это немного отличается от ActiveRecord::Base.connection.execute. Они одинаковые?

1 Ответ

1 голос
/ 27 июня 2019

Предполагая значения по умолчанию, все ваши модели должны наследоваться от ActiveRecord::Base, поэтому ActiveRecord::Base.connection.execute и ваши connection.execute(...) методы должны быть точно такими же (за исключением случаев, когда вы вызываете супер методы).

Теперь, ваш execute_sql метод выглядит немного иначе, чем он принимает аргумент *sql_array (который является массивом), что означает, что синтаксис немного отличается от ActiveRecord::Base.connection.execute, потому что теперь вы можете предоставлять sanitized аргументы в SQL: т.е. User.execute_sql('SELECT * FROM users WHERE created_at > ?, Time.zone.now).

Rails использует ConnectionPool . Таким образом, каждый HTTP-запрос будет пытаться получить от Connection в этом пуле, и когда он будет завершен, Соединение не будет закрыто, а будет просто возвращено в этот пул. Rails не будет бесконечно пытаться открывать соединения с течением времени. Укажите :pool размер в database.yml в соответствии с вашими производственными потребностями и пределами соединений с БД. Размер :pool - это максимальное количество подключений, а не количество подключений; Rails не создает соединения сразу; только по требованию.

Однако, если вы намеренно не собираетесь больше использовать Connection в течение потока / запроса, и вы хотите немедленно вернуть Connection в пул, тогда вы можете просто сделать ActiveRecord::Base.connection_pool.release_connection

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