Как управлять открытием и закрытием соединений с базой данных при работе с активными записями и несколькими потоками спрашивает о том, как обрабатывать несколько потоков со своим собственным соединением, каждое.
Я хочу сделать что-то похожее, но не то же самое: в моем отдельном (по умолчанию / главном) потоке в приложении Rails (Rails 4, если это важно, и его нельзя обновить до Rails 5 для этой проблемы), я хочу выполнить код ActiveRecord на отдельном соединении от основного.
т.е. (грубый псевдокод):
MyModel.find(...).... # works on the normal, basic connection handled by "the system"
conn = ActiveRecord::... # separate connection only used here
MyModel.find(...) # original connection
MyModel.create!(..., use_connection: conn) # separate connection only used here
MyModel.find(...) # original connection
some_obj.do_something(...) # original connection
conn.close # separate connection only used here
MyModel.find(...) # original connection
Вопросы:
- Я знаю о
establish_connection
и т. Д., Но эти методы, похоже, предполагают, что существует одна связь; то есть они автоматически закрывают / заменяют исходный или, по крайней мере, так кажется после просмотра API. Как правильно создать новое соединение, чтобы оно не влияло на существующее?
- Приложение: временная замена соединения по умолчанию невозможна; другой код, такой как
some_obj.do_something
, должен использовать исходное соединение, даже при работе с MyModel
, в примере.
- Как я могу сказать AR, чтобы фактически использовал новое соединение для этой конкретной линии ? Как правило, в случае модели от модели может быть отдельное соединение, но здесь я хотел бы иметь чисто временное соединение, совершенно не связанное с какой-либо конкретной моделью.
N.B .: Обратите внимание, что я знаю, что я делаю на уровне БД, т. Е. Я знаю, как работают все транзакции, и * не * ищу ActiveRecord::Base#transaction
. Я также не просто ищу способы обмануть обработку коммитов AR или что-то в этом роде. Я знаю о проблемах транзакций и производительности, связанных с этим, и приведенный выше пример кода, очевидно, не является реальным кодом или даже близок к нему (требуется обработка исключений и т. Д.). Пожалуйста, не отвечайте с решением проблемы X-Y. Представьте себе «автономную транзакцию» на языке Oracle.