加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读