Я использую rufus-scheduler для запуска ряда частых заданий, которые выполняют некоторые различные задачи с объектами ActiveRecord. Если есть какой-либо сетевой или postgresql hiccup, даже после восстановления, все потоки будут вызывать следующую ошибку до перезапуска процесса:
ActiveRecord:: ConnectionTimeoutError (не удалось получить соединение с базой данных в течение 5 секунд (дождался 5.000122687 секунд). Максимальный размер пула в настоящее время равен 5, подумайте об увеличении его.
Ошибка может быть легко воспроизведена путем перезапуска postgres. Я пробовал играть (до 15) с размером пула, но вам не повезло.
Это заставляет меня полагать, что соединения находятся в простом состоянии, которое, как я думал, будет исправлено с вызовом clear_stale_cached_connections!
.
Есть ли более надежный шаблон для этого?
Блок, который передается, представляет собой простой вызов выбора и обновления активной записи, и, случается, имеет значение, что такое объект AR.
Работа rufus:
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