並列処理中でActiveRecord::ConnectionTimeoutErrorが出たときの対処法とは

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

大量のデータを処理したいときは並列処理が便利ですよね〜

タイトルとURLをコピーしました