【问题标题】:Connection Pool for rails 5rails 5的连接池
【发布时间】:2016-06-24 02:18:00
【问题描述】:

我在使用 rails 5 rc1 时遇到了这个问题。有谁知道如何在环境文件中配置它以及 rails 5 活动记录的默认连接池大小是多少。

   Puma caught this error: could not obtain a connection from the pool within 5.000 seconds (waited 5.000 seconds); all pooled connections were in use (ActiveRecord::ConnectionTimeoutError)
    /home/bsethi/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:202:in `block in wait_poll'
    /home/bsethi/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:193:in `loop'
    /home/bsethi/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:193:in `wait_poll'
    /home/bsethi/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:154:in `internal_poll'
    /home/bsethi/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:278:in `internal_poll'
    /home/bsethi/.rvm/gems/ruby-2.2.2/gems/activerecord-5.0.0.rc1/lib/active_record/connection_adapters/abstract/connection_pool.rb:148:in `block in poll'

【问题讨论】:

  • 两个答案都是正确的,但是有没有办法把它放在配置文件中?
  • 我更新了我的答案。基本上来说,这只是@Alessandro Caetano 回答的延续。

标签: ruby-on-rails ruby-on-rails-5


【解决方案1】:

在所有 Rails 版本中,我都使用了 config/database.yml 中配置的连接池

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

所以只要增加它:

development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 10
  timeout: 5000

如果有帮助,请告诉我。

更新

将值放入 environment/*.rb 文件似乎不是那么简单。 恕我直言,最接近的方法是使用 @Alessandro Caetano 建议的 ENV 变量。

社区有这样的操作宝石:rais-dotenv

您可以为每个环境创建 .env.* 文件,然后 dotenv 会相应地加载它。

这是一个例子:

# .env.development
main_db_database=main_db_development
main_db_pool=5
main_db_host=localhost
main_db_port=3306
main_db_user=user
main_db_password=password

然后在你的database.tml中

development: &main_db
  adapter: mysql2
  encoding: utf8
  reconnect: true
  database: <%= ENV['main_db_database'] %>
  pool: <%= ENV['main_db_pool'] ? ENV['main_db_pool'].to_i : 5 %>
  host: <%= ENV['main_db_host'] %>
  port: <%= ENV['main_db_port'] %>
  username: <%= ENV['main_db_username'] %>
  password: <%= ENV['main_db_password'] %>

【讨论】:

【解决方案2】:

您可以在 config/database.yml 中设置连接池限制,如下所示:

production:
   url:  <%= ENV["DATABASE_URL"] %>
   pool: <%= ENV["DB_POOL"] || ENV['RAILS_MAX_THREADS'] || 5 %>

【讨论】:

  • 你只是在 boot.rb 文件中添加ENV["DB_POOL"] = x 吗?
  • @NicolasGuillaume 您可以使用export DB_POOL = 5 等在您的~/.bashrc 文件中设置这些变量。之后,您需要source ~/.bashrc 将更改应用到当前终端会话或打开一个新终端,然后您的 Rails 应用程序应该能够识别环境变量。如果您不喜欢在 bashrc 中放置环境变量,您可以使用 gem,正如 @retgoat 所建议的那样。
  • 您也可以使用github.com/laserlemon/figaro,它将唯一的环境变量存储在config/application.yml 中,如果缺少变量,可能会引发错误。
猜你喜欢
  • 2023-01-07
  • 2018-11-26
  • 2023-01-03
  • 1970-01-01
  • 2018-08-21
  • 2014-01-01
  • 2013-08-20
  • 1970-01-01
  • 2014-09-14
相关资源
最近更新 更多