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

时间:2016-12-30 17:29:12

标签: ruby-on-rails ruby activerecord sinatra sinatra-activerecord

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

use ActiveRecord::ConnectionAdapters::ConnectionManagement

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

从ActiveRecord 5开始,此行不再有效。这conversation in the rails project states

  

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

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

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

after do
  ActiveRecord::Base.clear_active_connections!
end

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

1 个答案:

答案 0 :(得分:11)

你是对的,ConnectionManagement中间件已从ActiveRecord 5(PR #23807)中删除,因此在Rails之外设置ActiveRecord时需要复制类似的功能。有几种方法可以做到这一点:

1。 ConnectionManagement机架中间件

ConnectionManagement class并不复杂。您可以在本地应用程序中的某处复制并粘贴实现,并将其像往常一样包含在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

2。 (特定于Sinatra)连接管理after挂钩

在Sinatra应用程序中,您建议的块应该有效:

after do
  ActiveRecord::Base.clear_active_connections!
end

请注意,这也是currently used集成gem支持ActiveRecord 5的方法sinatra-activerecord(请参阅问题#73)。

3。 ActionDispatch::Executor机架中间件

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

require 'action_dispatch/middleware/executor'
use ActionDispatch::Executor, ActiveSupport::Executor
ActiveRecord::QueryCache.install_executor_hooks