在ActiveRecord 5中替换ActiveRecord :: ConnectionAdapters :: ConnectionManagement

esi*_*ver 12 ruby activerecord ruby-on-rails sinatra sinatra-activerecord

我们正在将一个Sinatra应用程序从ActiveRecord 4升级到ActiveRecord 5.之前我们有这一行:

use ActiveRecord::ConnectionAdapters::ConnectionManagement

这是因为在请求完成后没有清理连接.以下是关于此主题的SO讨论:

从ActiveRecord 5开始,此行不再有效.rails项目中的这个对话说明:

删除它有利于Executor和Reloader API.被删除的中间件不是公共API的一部分.如果你想在Rails之外使用它,你需要制作一个.

这是否意味着,如果有人要将ActiveRecord 5与Sinatra一起使用,除非开发人员重新创建现已删除的中间件,否则连接将在请求后再次"泄露"或未返回到池中?

在Sinatra示例中,现在是否需要在ActiveRecord 5中包含此行?

after do
  ActiveRecord::Base.clear_active_connections!
end
Run Code Online (Sandbox Code Playgroud)

这就是链接线程的含义,但我希望得到一个明确的答案,我可以回到我的开发团队.

wjo*_*dan 11

您是对的,ConnectionManagement中间件已从ActiveRecord 5(PR #23807)中删除,因此在Rails之外设置ActiveRecord时需要复制类似的功能.做这件事有很多种方法:

1. ConnectionManagement机架中间件

ConnectionManagement堂课不是很复杂.您可以在本地应用程序中的某处复制并粘贴实现,并将其像往常一样包含在Rack中间件堆栈中:

class ConnectionManagement
  def initialize(app)
    @app = app
  end

  def call(env)
    testing = env['rack.test']

    status, headers, body = @app.call(env)
    proxy = ::Rack::BodyProxy.new(body) do
      ActiveRecord::Base.clear_active_connections! unless testing
    end
    [status, headers, proxy]
  rescue Exception
    ActiveRecord::Base.clear_active_connections! unless testing
    raise
  end
end

use ConnectionManagement
Run Code Online (Sandbox Code Playgroud)

2.(Sinatra特定的)连接管理after挂钩

在Sinatra应用程序中,您建议的块应该工作:

after do
  ActiveRecord::Base.clear_active_connections!
end
Run Code Online (Sandbox Code Playgroud)

请注意,这也是该方法目前使用的sinatra-activerecord整合宝石支持ActiveRecord的5(参见问题#73).

3. ActionDispatch::Executor机架中间件

最后,您可以使用Rails现在用于ActiveRecord连接管理的相同代码,方法是添加ActionDispatch::Executor到您的Rack中间件堆栈,并调用ActiveRecord::QueryCache#install_executor_hooks插入用于清除ActiveRecord连接的挂钩:

require 'action_dispatch/middleware/executor'
use ActionDispatch::Executor, ActiveSupport::Executor
ActiveRecord::QueryCache.install_executor_hooks
Run Code Online (Sandbox Code Playgroud)

  • 我在这个gem中包装了`class ConnectionManagement`:https://github.com/ioquatix/activerecord-rack (2认同)