You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么rails runner进程无法像puma、sidekiq一样在数据库断开后自动重连?

问题原因
  • puma作为Web服务器,默认搭载了Rails的ActiveRecord::ConnectionAdapters::ConnectionManagement中间件,每个请求处理完成后都会校验数据库连接有效性,失效连接会被自动清理,下次请求时会重新创建有效连接。
  • sidekiq的任务执行逻辑内置了连接校验步骤,每个任务执行前后都会检查数据库连接状态,检测到连接断开后会主动释放失效连接,从连接池获取新连接。
  • 通过rails runner启动的ruby-clock属于长期运行的单进程调度程序,本身没有内置数据库连接有效性校验机制:进程启动时会初始化一次数据库连接,后续如果数据库重启导致连接失效,进程不会主动识别连接状态变化,执行调度任务时依然调用已失效的旧连接,就会出现连接错误。
关于自动重连配置的疑问

puma和sidekiq没有使用特殊的数据库连接池配置,二者的自动重连能力来自上层框架内置的连接状态检查逻辑。Rails原生的数据库连接池本身就支持自动创建新连接,只要触发了连接有效性校验,发现连接失效后就能自动获取可用的新连接。

修复方案

可以在ruby-clock的调度任务外层增加异常捕获逻辑,遇到数据库连接相关报错时,主动调用ActiveRecord::Base.connection.verify!或者ActiveRecord::Base.clear_active_connections!触发重连即可。


内容的提问来源于stack exchange,提问作者John Bachir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:09:00