ActiveRecord の connection_pool のおはなし

TL;DR

config/database.ymlpool = Rails 1プロセスあたりのコネクション数

非同期処理

  • Sidekiq はマルチスレッド(= Rails プロセスは1つ)のため、pool の値が concurrency の上限値になる
  • Delayed Job, Resque はマルチプロセス(= 各プロセスが Rails のプロセスをもっている)のため関係なし

Unicron

before_fork do |server, worker|
  ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  ActiveRecord::Base.establish_connection
end
  • Unicorn は worker ごとにコネクションをはってる
  • before_fork でコネクションをきる(master プロセスがコネクションをもたないようにするため)
  • after_fork(= 各 worker)でコネクションをはる
  • スレッドとか使っていなければ各 worker 1コネクションですむはず