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时需要复制类似的功能.做这件事有很多种方法:
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)
after挂钩在Sinatra应用程序中,您建议的块应该工作:
after do
ActiveRecord::Base.clear_active_connections!
end
Run Code Online (Sandbox Code Playgroud)
请注意,这也是该方法目前使用的由sinatra-activerecord整合宝石支持ActiveRecord的5(参见问题#73).
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)
| 归档时间: |
|
| 查看次数: |
1196 次 |
| 最近记录: |