3

我已经制作了一个使用 Rails 4 中的 Live 方法的应用程序。但是,当我使用它时,每次刷新都会继续占用一个连接,直到它达到与数据库的最大连接数,然后永远挂起并加载。

当用户刷新站点或决定离开站点时,我可以做些什么来确保断开连接?

这是我的设置:

  def events
    response.headers["Content-Type"] = "text/event-stream"
    redis = Redis.new
    redis.psubscribe("participants.*") do |on|
      on.pmessage do |pattern, event, data|
        response.stream.write("event: #{event}\n")
        response.stream.write("data: #{data}\n\n")
      end
    end
  rescue IOError
    logger.info "Stream closed"
  ensure
    redis.quit
    response.stream.close
  end

我使用 Nginx 和 Rainbows!在 Ubuntu 10.04 上。Ruby 2.0.0-p195 Postgresql Rails 4

4

1 回答 1

0

因此,如果您在自己创建的线程中执行该逻辑,我的答案是,将所有内容包装在:

def events
  ActiveRecord::Base.connection_pool.with_connection do
    response.headers[etc
    #..
  end
end

现在,您不是在制作自己的线程。根据您的症状,我怀疑无论如何都可以解决您的问题,这会很有趣。

但是,它可能不是必需的,因为 ActionController::Live 是 Rails 的官方支持部分,文档和示例并没有说你应该做这with_connection件事。我对 ActionController::Live 自己不熟悉;听起来它可能是一个错误。在创建一个尽可能小的应用程序来演示问题之后,您可能希望使用 Rails 问题跟踪器提交文件。

我怀疑您的应用程序中发生的事情比您向我们展示的要多——您向我们展示的方法根本不使用 ActiveRecord,因此根本没有理由使用任何数据库连接。或者等等,你所说的“数据库连接”实际上是指 Redis 吗?如果是这样,那么请忽略整个答案,因为我假设 ActiveRecord。我也没有使用 Redis 的经验,但是如果“数据库连接”是指 Redis,那么这是一个 Redis 问题,您可能想尝试在 Redis 问题跟踪器上提交问题。或者,当然,至少将这个问题标记为“redis”,以便了解 redis 的人可能会看到它。

于 2014-11-05T22:11:53.593 回答