4

对于数据库密集型视图,我已转向数据库非规范化/缓存以减少服务器资源需求并提高用户性能。视图是一个汇总视图,由来自许多不同表的数据组成,因此许多不同的数据更改也会更新缓存。

为了减少缓存中的流失,我求助于 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 时如何修复连接泄漏?

4

1 回答 1

7

ActiveRecord 提供了一种手动清除连接的方法 - ActiveRecord::Base.clear_active_connections!. 在数据库中进行更改后,更新call中间件中的方法以清除活动连接。

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

于 2013-06-25T17:17:19.450 回答