ConnectionTimeoutError на Heroku с Postgres

У меня проблемы с моим приложением, развернутым на Heroku. Он отлично работает на локальной среде, но при развертывании на Heroku часто возникают ошибки приложения.

Исключениями в журналах являются: ActiveRecord::ConnectionTimeoutError (не удалось установить соединение с базой данных в течение 5 000 секунд (ожидание 5 000 секунд))

В контроллере и моделях нет ничего особенного, скорее простые операции CRUD.

Приложение построено на Rails 4, в нем используется стандартная надстройка базы данных heroku postgres и сервер WEBrick.

Я попытался установить конфигурацию следующим образом:

#config/initializers/database_connection.rb
Rails.application.config.after_initialize do
  ActiveRecord::Base.connection_pool.disconnect!

  ActiveSupport.on_load(:active_record) do
    config = Rails.application.config.database_configuration[Rails.env]
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 5 # seconds
    config['pool']              = ENV['DB_POOL']      || 10
    config['timeout']           = ENV['DB_TIMEOUT']   || 10
    ActiveRecord::Base.establish_connection(config)
  end
end

но это не помогло.

У вас есть идеи, что может помочь?


person nataliastanko    schedule 13.01.2014    source источник


Ответы (2)


Ваш пул БД не проблема. Это известная проблема с рельсами. Если вы используете Rails 4.0.2, то претензия заключается в том, чтобы вместо этого использовать мастер рельсов в вашем Gemfile. Я тоже сталкиваюсь с этой проблемой, но я еще не пробовал это решение.

person Simpleton    schedule 20.02.2014
comment
Спасибо за это! Я только что обновился с 4.0.3 до 4.0.4, и проблема устранена. Оставил меня с другой проблемой, но эй. - person Evolve; 11.04.2014
comment
Моей вторичной ошибкой было «NoMethodError: неопределенный метод «среда» для nil: NilClass», из-за которого heroku не развертывался. Я обновил sass-rails с 4.0.1 до 4.0.3, и это устранило эту второстепенную проблему. - person Evolve; 11.04.2014
comment
@Daniel, по-видимому, это будет окончательно исправлено в Rails 4.2, см. последний комментарий в ссылке выше. - person Mike Szyndel; 18.09.2014

Пример кода, который вы разместили, является законным. Вероятно, что-то вызывает проблему в вашей среде конфигурации Heroku.

Ошибка, которую вы видите, указывает на то, что значение DB_POOL установлено слишком низким. Эта ошибка указывает на тайм-аут на сервере приложений, ожидающего проверки соединения из пула, не обязательно на сбой соединения. Возможно ли, что для вашего DB_POOL установлено значение 1 или низкое значение?

Вы также должны убедиться, что конфигурация вашей базы данных завершена, что у вас есть полное имя хоста, учетные данные и конфигурация из конфигурации базы данных по умолчанию. Вы можете запустить следующее в консоли Heroku:

Rails.application.config.database_configuration[Rails.env]

В настройках конфигурации Heroku есть что-то неправильное, что вызывает этот тайм-аут.

person Winfield    schedule 14.01.2014
comment
Спасибо за Ваш ответ! Я проверю. - person nataliastanko; 16.01.2014
comment
Я увеличил значения в config/database.yml, что решило это для меня. Я думаю, что значение по умолчанию равно 5, но в Heroku максимальный пул зависит от выделенной базы данных и уровня. - person whodini9; 10.07.2019