[英]Unicorn keeps losing connection to postgres database on heroku
I have setup an app on heroku using the unicorn web server. 我使用unicorn Web服务器在heroku上设置了一个应用程序。 My database is setup on an external server (not on heroku). 我的数据库是在外部服务器上设置的(不是在heroku上)。 I have configured the DATABASE_URL as required. 我已根据需要配置了DATABASE_URL。 When I run heroku console I am able to successfully run queries on the server. 当我运行heroku控制台时,我能够在服务器上成功运行查询。 However, when I go to a URL after unicorn has booted up, I get this error: 但是,当我在unicorn启动后转到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'
I have configured it as per the instructions. 我按照说明配置了它。 Here is my unicorn config. 这是我的独角兽配置。
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
Why is the connection closing, even after it has made a successful connection? 为什么即使连接成功后连接也会关闭? (I see Unicorn connected to database
in the logs. (我看到Unicorn connected to database
日志中的Unicorn connected to database
。
In Rails 3 + Resque, I had to add this: 在Rails 3 + Resque中,我不得不添加:
Resque.after_fork do |job|
ActiveRecord::Base.verify_active_connections!
end
I'm betting something similar will work for you. 我打赌类似的东西会对你有用。 Connections in the pool are timing out; 池中的连接超时; and they have to be purged. 他们必须被清除。 There have been changes in Rails 4 around this though, see here https://github.com/socialcast/resque-ensure-connected/issues/3 虽然有关Rails 4的变化,请参阅https://github.com/socialcast/resque-ensure-connected/issues/3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.