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

fangxing204 · December 14, 2017 · Last by huacnlee replied at December 14, 2017 · 1534 hits

以前公司的项目里面从来没看到过这个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

没上下文,无法回答

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

@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)超时以后会自动释放

You need to Sign in before reply, if you don't have an account, please Sign up first.