2013-07-02 27 views
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 

回答

0

聯接塊之後堅持這似乎工作:

ActiveRecord::Base.verify_active_connections!