ActiveRecord::ConnectionTimeoutErrorとは
Railsの並列処理ライブラリである「Parallel」で並列処理をしてたら、ActiveRecord::ConnectionTimeoutErrorが発生。
could not obtain a connection from the pool within 5.000 seconds (waited 5.000 seconds);
all pooled connections were in use (ActiveRecord::ConnectionTimeoutError)
どうやら並列処理中のthread毎にDBコネクションが発生し、並列処理で回してるthread数がdatabase.ymlのconnection_poolに書かれている数よりも大きいとエラーが出てしまうらしい。
なお、connection_poolを書いてない場合はデフォルトの5となります。
解決方法
並列で回す処理部分を以下のコードで囲えばエラーは出ませんでした。
ActiveRecord::Base.connection_pool.with_connection do
#処理
end
【エラーが出る書き方】
Parallel.each(1..200000, in_threads: 10) do |num|
puts num
end
【エラーの出ない書き方】
Parallel.each(1..200000, in_threads: 10) do |num|
ActiveRecord::Base.connection_pool.with_connection do
puts num
end
end
大量のデータを処理したいときは並列処理が便利ですよね〜