Railsのbefore_forkで接続を閉じる必要あるの?

Railsunicornやpumaのconfigをネットでググってみると以下のような設定が見つかる。

# unicorn
preload_app true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection
end
# puma
preload_app!

before_fork do
  ActiveRecord::Base.connection.disconnect!
end

on_worker_boot do
  ActiveRecord::Base.establish_connection
end

いるのこれ?

workerを起動する前にmasterプロセスのDB接続を閉じてるんすけど、なんで閉じるんすかね?

おそらくこれはforkした子プロセスがmasterで使ってるリソースを共有しないように切断させたいという意図だと思います。preload appでforkした場合、copy-on-writeでメモリが共有されるためコネクションもプロセス間で共有されしまい、これに複数プロセスが同時に読み書きしてしまうと不具合が発生して困ったことになります。

しかし、masterプロセスはリクエストを子プロセスにディスパッチするだけで自身は応答処理をしないためDB接続もしません。disconnectしても何も起こらないはずです。プロセス間でコネクションが共有される事もないので接続を切る必要もないと思います。

また、Railsはコネクションプーリングを使っていて、実際にDBアクセスが必要になるまで接続せず、単にestablishを呼んだだけでは何もしないはずです。よってfork後に再接続する必要もないと思うんですよね。

RailsActiveRecordは抽象化されているのでコネクションプーリングしない実装への考慮として書いておくのが流儀なのでしょうか? まぁ、実はcron的な処理を起動していてmasterがDB接続してましたーみたいな想定外に対する保険として書いておいてもいいのかもしれないですが。結局のところ意図はよくわからない。