新手问题 请问什么时候需要手动调用 clear_active_connections!()

fangxing204 · 2017年12月14日 · 最后由 huacnlee 回复于 2017年12月14日 · 404 次阅读

以前公司的项目里面从来没看到过这个ActiveRecord::Base.clear_active_connections!, 但是最近接触的一个项目里面看到好多这种代码. 从ActiveRecord的文档我知道它是释放当前线程的connections, 但是这不应该是自动的吗?

在这个项目中我看到的大概是这样的

def update_entries
  # 查询数据库中的记录
  Entry.find_each do |e|
      # 1. 调用第三方api, 查询记录信息
      # 2.  处理信息
      # 3. 保存
  end
  ActiveRecord::Base.clear_active_connections!
end
共收到 8 条回复

没上下文,无法回答

还是要看代码具体是干啥了

@huacnlee 谢谢建议, 加了上下文

这个 update_entries 函数可能是一些非 Web 的地方调用的,例如 Rake 命令的批量处理动作。

Rails 是会自动处理数据库连接释放的事情,但 ActiveRecord 不会。

在非 Web 的场景,是需要手动调用 ActiveRecord::Base.clear_active_connections!

如果上面 find_each 的 block 异常了,理论上你们这个代码还存在 Connection 泄漏的问题

def update_entries
  # 查询数据库中的记录
  Entry.find_each do |e|
      # 1. 调用第三方api, 查询记录信息
      # 2.  处理信息
      # 3. 保存
  end
ensure
  ActiveRecord::Base.clear_active_connections!
end

多谢, 大概懂了

顺带还有一个细节:

number of seconds that a connection will be kept unused in the pool before it is automatically disconnected (default 300 seconds)

大概意思是连接实际上有个超时时间(默认 300s)超时以后会自动释放

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册