Rails 6 множественные базы данных и проблемы тайм-аута запроса при запуске db: migrate - PullRequest
0 голосов
/ 23 октября 2019

Вкл. MyModel Я использую конфигурацию, которая позволяет репликации базы данных работать

connects_to database: { writing: :primary, reading: :follower }

В некоторых миграциях есть такие запросы, как:

MyModel.update_all(...)

И они приводят к:

PG::QueryCanceled: ERROR:  canceling statement due to statement timeout

Если я удаляю connects_to database: { writing: :primary, reading: :follower } Я больше не получаю эту ошибку, которая каким-то образом доказывает, что установка репликации ответственна за эту ошибку в файле миграции.

Я знаю, что могу начать исправление всех миграций, но я бы предпочел не делать этого ..

1 Ответ

0 голосов
/ 23 октября 2019

Я заметил, что Rails использует несколько соединений с базой данных, и они создают взаимоблокировки друг с другом.

Это происходило из-за того, что некоторые модели должным образом расширяли ApplicationRecord (где должна быть определена роль чтения / записи!), Однако некоторые из них расширяли ActiveRecord :: Base, что приводило к открытию большего количества соединений, чем требовалось.

Одной из моих попыток было также создание абстрактного класса ApplicationRecordWithReplication, который я использовал для моделей, где требовалась репликация. Это снова привело к большему количеству соединений с БД, чем необходимо.

...