我正在使用rufus-scheduler來運行一些頻繁的工作,它們使用ActiveRecord對象執行一些各種任務。如果有任何形式的網絡或postgresql打嗝,即使在恢復後,所有線程都會拋出以下錯誤,直到進程重新啓動:rufus-scheduler中ActiveRecord對象的連接池問題
ActiveRecord :: ConnectionTimeoutError(無法在5秒內獲得數據庫連接(等待5.000122687秒),最大池大小目前是5;考慮增加它
錯誤可以很容易地通過重新啓動postgres重現我曾嘗試使用遊戲池大小玩(最多15),但沒有運氣。
這使我相信這些連接只是處於陳舊狀態,我認爲這將會通過撥打clear_stale_cached_connections!
來解決。
有沒有更可靠的模式來做到這一點?
傳遞的塊是一個簡單的選擇和更新活動記錄調用,並且碰巧不管AR對象是什麼。
的魯弗斯工作:
scheduler.every '5s' do
db do
DataFeed.update #standard AR select/update
end
end
包裝:
def db(&block)
begin
ActiveRecord::Base.connection_pool.clear_stale_cached_connections!
#ActiveRecord::Base.establish_connection # this didn't help either way
yield block
rescue Exception => e
raise e
ensure
ActiveRecord::Base.connection.close if ActiveRecord::Base.connection
ActiveRecord::Base.clear_active_connections!
end
end
它的任何更新? – jbmyid
我也面臨同樣的問題,上面嘗試,甚至「ActiveRecord :: Base.connection_pool.with_connection」做但不工作 – jbmyid