Unicorn продължава да губи връзка с базата данни на postgres на heroku

Настроих приложение на heroku, използвайки уеб сървъра на еднорога. Моята база данни е настроена на външен сървър (не на heroku). Конфигурирах DATABASE_URL според изискванията. Когато стартирам конзолата heroku, мога успешно да изпълнявам заявки на сървъра. Въпреки това, когато отида на URL адрес, след като еднорогът се стартира, получавам тази грешка:

2014-03-14T01:44:53.820853+00:00 app[web.1]: ActiveRecord::StatementInvalid (PG::ConnectionBad: connection is closed:               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
2014-03-14T01:44:53.820853+00:00 app[web.1]:                      pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod
2014-03-14T01:44:53.820853+00:00 app[web.1]:                 FROM pg_attribute a LEFT JOIN pg_attrdef d
2014-03-14T01:44:53.820853+00:00 app[web.1]:                   ON a.attrelid = d.adrelid AND a.attnum = d.adnum
2014-03-14T01:44:53.820853+00:00 app[web.1]:                WHERE a.attrelid = '"currencies"'::regclass
2014-03-14T01:44:53.820853+00:00 app[web.1]:                  AND a.attnum > 0 AND NOT a.attisdropped
2014-03-14T01:44:53.820853+00:00 app[web.1]:                ORDER BY a.attnum
2014-03-14T01:44:53.820853+00:00 app[web.1]: ):
2014-03-14T01:44:53.820853+00:00 app[web.1]:   app/controllers/search_controller.rb:5:in `index'

Конфигурирах го според инструкциите. Ето моята конфигурация на еднорога.

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 2)
timeout 25
preload_app true

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

    if defined?(ActiveRecord::Base)
      ActiveRecord::Base.connection.disconnect!
      puts 'Unicorn disconnected from database'
    end

  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis.quit
    Rails.logger.info('Disconnected from Redis')
  end
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  if defined?(ActiveRecord::Base)
    config = Rails.application.config.database_configuration[Rails.env]
    config['reaping_frequency'] = ENV['DB_REAP_FREQ'] || 10
    config['pool'] = ENV['DB_POOL'] || 2
    ActiveRecord::Base.establish_connection(config)
    puts 'Unicorn connected to database'
  end

  # If you are using Redis but not Resque, change this
  if defined?(Resque)
    Resque.redis = $redis
    Rails.logger.info('Connected to Redis')
  end
end

Защо връзката се затваря, дори след като е направил успешна връзка? (Виждам Unicorn connected to database в регистрационните файлове.


person Nick Barrett    schedule 14.03.2014    source източник
comment
как се справи с това?   -  person brauliobo    schedule 04.10.2014
comment
Има ли мрежова настройка, която блокира връзката ви след определено време, като изчакване?   -  person rrrrong    schedule 16.10.2014


Отговори (1)


В Rails 3 + Resque трябваше да добавя това:

Resque.after_fork do |job|
  ActiveRecord::Base.verify_active_connections! 
end

Обзалагам се, че нещо подобно ще ви свърши работа. Връзките в пула изтичат; и те трябва да бъдат прочистени. Въпреки това има промени в Rails 4 около това, вижте тук https://github.com/socialcast/resque-ensure-connected/issues/3

person James Daniels    schedule 16.10.2014