ActiveRecord:: ConnectionNotEstablished - нет пула соединений для X

Я не могу заставить мое приложение sinatra/ruby, размещенное на герой, работать по своему желанию. Я искал некоторые настройки, пытаясь решить эту проблему, но пока никаких результатов.

ActiveRecord::ConnectionNotEstablished - No connection pool for User:
2015-06-25T14:26:11.736854+00:00 app[web.1]:    /app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:566:in `retrieve_connection'
2015-06-25T14:26:11.736856+00:00 app[web.1]:    /app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.1/lib/active_record/connection_handling.rb:113:in `retrieve_connection'
2015-06-25T14:26:11.736858+00:00 app[web.1]:    /app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.2.1/lib/active_record/connection_handling.rb:87:in `connection'

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

Я использую синатра с резервным копированием puma. Вот мой Procfile:

web: ruby app/my-server.rb -s puma

Я также проверял, сколько открытых подключений используется:

select count(*) from pg_stat_activity where pid <> pg_backend_pid()  and usename = current_user; 

но каждый раз он говорит 0.

Я размещаю приложение на бесплатном плане и dev-плане героевповторов.

Я также заметил, что проблема возникает, когда есть 2 быстрых вызова api на короткий промежуток времени. Например, было доступно только 1, а не 5 соединений, потому что 1-й вызов завершен, а второй - неудачный. В моей базе данных .yml я устанавливаю пул в 5.

Я на Rails 4.2.1 и Postgres 9.4

Вот моя база данных .yml:

default: &default
  adapter: postgresql
  encoding: utf8
  pool: 5
  timeout: 5000

production:
  <<: *default
  host: my_db_address
  port: 5432
  database: my_db_name
  username: my_db_user_name
  password: my_db_password

< test and development ommited >

Я пропустил какую-то конфигурацию или освободил демарки плана герою?

Ответы

Ответ 1

Пожалуйста, проверьте, как ваше приложение-синатра установило соединение.

configure :production, :development do
  db = URI.parse(ENV['DATABASE_URL'] || 'postgres://localhost/mydb')
  pool = ENV["DB_POOL"] || ENV['MAX_THREADS'] || 5
  ActiveRecord::Base.establish_connection(
        adapter:  db.scheme == 'postgres' ? 'postgresql' : db.scheme,
        host:      db.host,
        username:  db.user,
        password:  db.password,
        database:  db.path[1..-1],
        encoding:  'utf8',
        pool:      pool
  )
end

Убедитесь, что у вас есть правильные настройки для пула, также убедитесь, что у вас есть конфигурация heroku для DB_POOL или MAX_THREADS.

heroku config:set DB_POOL=5

или

heroku config:set MAX_THREADS=5