我们正在将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
这就是链接线程的含义,但我想得到一个明确的答案,我可以回到我的开发团队。
答案 0 :(得分:11)
你是对的,ConnectionManagement
中间件已从ActiveRecord 5(PR #23807)中删除,因此在Rails之外设置ActiveRecord时需要复制类似的功能。有几种方法可以做到这一点:
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
after
挂钩在Sinatra应用程序中,您建议的块应该有效:
after do
ActiveRecord::Base.clear_active_connections!
end
请注意,这也是currently used集成gem支持ActiveRecord 5的方法sinatra-activerecord
(请参阅问题#73)。
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