1
TL; DR你如何關閉後ActiveRecord的連接到數據庫服務器你加入一個線程?線程,ActiveRecord的和「PG ::錯誤:FATAL:剩餘的連接插槽預留給非複製超級連接」
我有一個一次又一次運行維護任務的rake任務,但需要強制執行任務的時間限制(並報告錯誤等)。我通過使用Thread.new
和#join(timeout)
,然後#kill
,如果它需要太長時間來完成。不幸的是經過幾次迭代後,我收到:
PG::Error: FATAL: remaining connection slots are reserved for non-replication superuser connections
看來,每次線程啓動時,Rails都會自動創建一個新的ActiveRecord連接。
當我在線程中運行ActiveRecord::Base.connection.close
時,問題消失,但不幸的是,由於#join
,我無法做到這一點。
這裏的簡化代碼:
while true
thr = Thread.new {
do_some_database_work
}
unless thr.join(10)
thr.kill
end
sleep 1
end