Railsのunicornや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後に再接続する必要もないと思うんですよね。
RailsのActiveRecordは抽象化されているのでコネクションプーリングしない実装への考慮として書いておくのが流儀なのでしょうか? まぁ、実はcron的な処理を起動していてmasterがDB接続してましたーみたいな想定外に対する保険として書いておいてもいいのかもしれないですが。結局のところ意図はよくわからない。