首页 > 解决方案 > 将现有的 MySQL rails 应用程序转换为使用 Postgres:“所有池连接都在使用中”

问题描述

我正在将一个项目从 MySQL 转换为 PostgreSQL。配置后,当我运行rake db:createrake db:migrate我收到错误:ActiveRecord::ConnectionTimeoutError: could not obtain a connection from the pool within 5.000 seconds (waited 5.000 seconds); all pooled connections were in use.

我尝试将池增加到 50。同一台机器上的另一个 rails 项目使用 PostgreSQL 就好了。任何想法可能会发生什么?

完整的堆栈跟踪是:

ActiveRecord::ConnectionTimeoutError: could not obtain a connection from the pool within 5.000 seconds (waited 5.000 seconds); all pooled connections were in use
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:202:in `block in wait_poll'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:193:in `loop'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:193:in `wait_poll'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:154:in `internal_poll'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:278:in `internal_poll'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:148:in `block in poll'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:158:in `synchronize'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:148:in `poll'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:747:in `acquire_connection'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:500:in `checkout'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:374:in `connection'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:931:in `retrieve_connection'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_handling.rb:116:in `retrieve_connection'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/connection_handling.rb:88:in `connection'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/schema_migration.rb:20:in `table_exists?'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/schema_migration.rb:24:in `create_table'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/migration.rb:1125:in `initialize'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/migration.rb:1007:in `new'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/migration.rb:1007:in `up'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/migration.rb:985:in `migrate'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/tasks/database_tasks.rb:171:in `migrate'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/activerecord-5.1.6.1/lib/active_record/railties/databases.rake:58:in `block (2 levels) in <top (required)>'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/gems/rake-12.3.2/exe/rake:27:in `<top (required)>'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/bin/ruby_executable_hooks:24:in `eval'
/Users/tonyporteous/.rvm/gems/ruby-2.5.3@citydash/bin/ruby_executable_hooks:24:in `<main>'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

配置文件部分如下所示:

default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # https://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: projectx_development

我像这样添加了宝石:

gem 'pg', '>= 0.18', '< 2.0'

标签: mysqlruby-on-railsrubypostgresql

解决方案


已解决的问题:是由 database.yml 文件中的错误引起的:

pool: <%%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

应该

pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

这(我猜)导致池大小为 0。


推荐阅读