【问题标题】:ActiveRecord::ConnectionTimeoutError: could not obtain a connection from the pool within 5.000 seconds. all pooled connections were in useActiveRecord::ConnectionTimeoutError: 无法在 5.000 秒内从池中获取连接。所有池连接都在使用中
【发布时间】:2017-05-21 16:10:51
【问题描述】:

我正在尝试在单轨应用程序中使用多个数据库。我创建了一个模型 ReportUser 来访问在 config/support_database.yml 中指定的不同数据库中定义的 report_users 表。正常模型 activeRecord 查询正在工作,但 ReportUser.count 不工作。我设法创建表和迁移,但是当我尝试使用活动记录查询访问具有辅助数据库的模型时,我从第二个数据库收到连接超时错误。

这是我遵循的几件事。

创建了一个不同的 config/database_support.yml 文件

default: &default
adapter: postgresql
encoding: unicode
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: sm_development

test:
  <<: *default
  database: sm_test

config/initializers/general.rb

SUPPORT_DB = YAML.load_file(File.join(Rails.root, "config", "database_support.yml"))[Rails.env.to_s]

app/models/support_base.rb

class SupportBase < ActiveRecord::Base 
  self.abstract_class = true 
  establish_connection(SUPPORT_DB)
end

app/models/report_user.rb

class ReportUser < SupportBase
end

db_support/migrate/2017_create_report_users.rb

class CreateReportUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :report_users do |t|
      t.string :first_name
      t.string :last_name
      t.string :email
    end
  end
end

lib/tasks/databases.rake

namespace :support do
  desc "Configure the variables that rails need in order to look up for the db configuration in a different folder"
  task :set_custom_db_config_paths do
    ENV['SCHEMA'] = 'db_support/schema.rb'
    Rails.application.config.paths['db'] = ['db_support']
    Rails.application.config.paths['db/migrate'] = ['db_support/migrate']
    Rails.application.config.paths['db/seeds.rb'] = ['db_support/seeds.rb']
    Rails.application.config.paths['config/database'] = ['config/database_support.yml']
  end

  namespace :db do
    task :create => :set_custom_db_config_paths do
        Rake::Task["db:create"].invoke
    end
    task :migrate => :set_custom_db_config_paths do
        Rake::Task["db:migrate"].invoke
    end
    task :rollback => :set_custom_db_config_paths do
        Rake::Task["db:rollback"].invoke
    end
  end

  namespace :test do
    task :check => [:environment] do
        puts "users count = #{User.count}"
        puts "report_users = #{ReportUser.count}"
    end
  end
end

在配置完所有这些并运行最后一个 rake 任务之后 rake support:test:check, 我收到此错误

ActiveRecord::ConnectionTimeoutError: could not obtain a connection from the pool within 5.000 seconds (waited 5.001 seconds); all pooled connections were in use
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:202:in `block in wait_poll'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:193:in `loop'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:193:in `wait_poll'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:154:in `internal_poll'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:278:in `internal_poll'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:148:in `block in poll'
from /Users/harsh/.rvm/rubies/ruby-2.3.1/lib/ruby/2.3.0/monitor.rb:214:in `mon_synchronize'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:158:in `synchronize'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:148:in `poll'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:709:in `acquire_connection'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:501:in `checkout'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:364:in `connection'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:875:in `retrieve_connection'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_handling.rb:128:in `retrieve_connection'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/connection_handling.rb:91:in `connection'
from /Users/harsh/.rvm/gems/ruby-2.3.1@rails5.0/gems/activerecord-5.0.0.1/lib/active_record/model_schema.rb:354:in `load_schema!'

puts "users count = #{User.count}" 工作正常, 但是puts "report_users = #{ReportUser.count}"给出连接超时错误。

【问题讨论】:

  • 什么是问题?
  • 我的问题是如何在 Rails 控制台中使用ReportUser.count。因为当我执行这个ReportUser.count 时,我得到了数据库连接错误。 ReportUser 是一个模型,它在 database_support.yml 文件中提到的不同数据库中具有表。该数据库不同于通常存在于 database.yml 中的默认数据库。我希望这可以解决问题。
  • 这适用于 rails 4.2。我认为rails 5.0中存在一些连接问题。有人知道吗?

标签: ruby-on-rails ruby activerecord activeresource


【解决方案1】:

我终于找到了解决方案。 Just Change config/database_support.yml

default: &default
adapter: postgresql
encoding: unicode
pool: 5

development:
  <<: *default
  database: sm_development

test:
  <<: *default
  database: sm_test

【讨论】:

  • 所以您所做的只是停止从环境中读取池编号?知道为什么这有帮助吗?另外,如果您没有在环境中设置RAILS_MAX_THREADS,结果将是相同的......
  • 很可能是因为他们没有解析 yml 文件中的 erb。
猜你喜欢
  • 2015-03-04
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 2016-04-16
  • 2012-12-08
  • 2017-10-07
  • 2014-02-19
  • 2017-03-31
相关资源
最近更新 更多