ruby-on-rails – 在Rack中间件中使用时,ActiveRecord会泄漏连接
发布时间:2020-12-17 03:05:28 所属栏目:百科 来源:网络整理
导读:对于数据库密集型视图,我转向数据库非规范化/缓存以减少服务器资源需求并提高用户性能.视图是由来自许多不同表的数据组成的摘要视图,因此许多不同的数据更改也会更新缓存. 为了减少缓存中的流失,我转向了Rack中间件.我的中间件看起来像这样: class MyMiddle
对于数据库密集型视图,我转向数据库非规范化/缓存以减少服务器资源需求并提高用户性能.视图是由来自许多不同表的数据组成的摘要视图,因此许多不同的数据更改也会更新缓存.
为了减少缓存中的流失,我转向了Rack中间件.我的中间件看起来像这样: class MyMiddleware def initialize(app) @app = app end def call(env) # ... prepare in memory storage for what needs to change return_value = @app.call(env) # ... commit changes to the database return_value end end 一切都看起来很棒,直到应用程序被加载了一段时间.然后我开始在日志中偶尔看到以下错误: Status: 500 Internal Server Error could not obtain a database connection within 5 seconds. The max pool size is currently 5; consider increasing it. 当我删除中间件时,应用程序再次正常工作. 从Rack中间件使用ActiveRecord时如何修复连接泄漏? 解决方法
ActiveRecord提供了一种手动清除连接的方法 – ActiveRecord :: Base.clear_active_connections!.更新中间件中的调用方法,以在数据库中进行更改后清除活动连接.
def call(env) # ... prepare in memory storage for what needs to change return_value = @app.call(env) # ... commit changes to the database ActiveRecord::Base.clear_active_connections! # fixes the connection leak return_value end http://api.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/ConnectionPool.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |