У меня возникла проблема, связанная с внешним AWS Aurora MySQL в моем приложении Rails на производстве.
Вот настройка:
В разработке все работает нормально, но когда я развертываю в Heroku, я могу только успешно запросить одну таблицу внешней базы данных. Когда я создаю другую таблицу, я получаю это сообщение об ошибке:
ActionView::Template::Error (Mysql2::Error::ConnectionError: Lost connection
to MySQL server during query: SELECT 'TMC_Identification'.'direction',
'TMC_Identification'.'miles', 'TMC_Identification'.'road',
'TMC_Identification'.'tmc' FROM 'TMC_Identification') :
1: <%= raw(@tmcs.to_json) %>
Модели:
class TmcReading < ApplicationRecord
establish_connection(:tmc_data)
self.table_name = "TMC_Readings"
end
class TmcIdentification < ApplicationRecord
establish_connection(:tmc_data)
self.table_name = "TMC_Identification"
end
database.yml:
default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
production:
<<: *default
database: production
username: admin
password: <%= ENV['DATABASE_PASSWORD'] %>
tmc_data:
adapter: mysql2
encoding: utf8
database: tmc_data
username: <%= Rails.application.credentials.tmc_data_db[:username] %>
password: <%= Rails.application.credentials.tmc_data_db[:password] %>
host: tmc-data.cluster-ro-xyz.us-east-1.rds.amazonaws.com
port: 3306
Действие контроллера
def tmc_identifications
@tmcs = TmcIdentification.all.select(:direction, :miles, :road, :tmc)
end
Посмотреть
<%= raw(@tmcs.to_json) %>
Все отлично работает в разработке, но не в производстве. Одна и та же база данных и учетные данные используются для производства для соединения "tmc_data".
Я предполагаю, что у меня проблемы с потоками, но я не знаю, как это исправить.
Я решил эту проблему следующим образом:
Модели:
class TmcData < ActiveRecord::Base
self.abstract_class = true
establish_connection(:tmc_data)
end
class TmcReading < ApplicationRecord
self.table_name = "TMC_Readings"
end
class TmcIdentification < ApplicationRecord
self.table_name = "TMC_Identification"
end
Подробнее: https://www.thegreatcodeadventure.com/managing-multiple-databases-in-a-single-rails-application/
Кроме того, я перестал подключаться к одной и той же вторичной базе данных с моей средой разработки и производства.