Rails5.2.0アップグレード時のマルチプロセスのコネクション管理
Rails5.1.6からRails5.2.0にアップグレードした際に対応が必要な箇所があったので対応内容をまとめます。
事象
アップグレード後にバッチを実行すると毎回同じ箇所でThreadErrorが発生するようになりました。
アップグレード前はバッチ実行時にスレッド数が一定だったのが、アップグレード後はバッチ実行に伴いスレッド数が増加しリソースの上限に達していました。
原因
リリースノート見てもスレッド関連の修正ないし何だろうとしばらく悩んでいましたが、調査したところマルチプロセス時のコネクションの管理をRails側で実行するようになったことが原因でした。
これまでマルチプロセス時のプロセス毎のコネクションはアプリケーション内で用意するコードを書いていましたが、Rails側で面倒を見てくれるようになったため処理が不要になったようです。
対応
修正前は下記のようにプロセス毎のコネクションを用意するコードを書いていました。
config = ActiveRecord::Base.remove_connection Parallel.each(4.times, in_processes: 4) do |i| ActiveRecord::Base.establish_connection(config) begin # 並列処理を実行 ensure ActiveRecord::Base.remove_connection end end
Rails5.2.0ではコネクションの管理が不要なため該当のコードを削除することで、バッチ処理を実行してもスレッド数も増えずエラーが出なくなりました。
Parallel.each(4.times, in_processes: 4) do |i| # 並列処理を実行 end
これで問題なくRails5.2.0にアップグレードできました!