我正在使用 rufus-scheduler 运行一些频繁的作业,这些作业使用 ActiveRecord 对象执行一些不同的任务。如果有任何类型的网络或 postgresql 打嗝,即使在恢复之后,所有线程都会抛出以下错误,直到进程重新启动:
ActiveRecord::ConnectionTimeoutError (could not get a database connection within 5 seconds (waited 5.000122687 seconds). 最大池大小当前为 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