3

Rails 4 で Live メソッドを使用するアプリケーションを作成しました。しかし、それを使用すると、DB への最大接続数に達するまで、更新ごとにもう 1 つの接続を取得し続け、ハングして永久にロードされます。

ユーザーがサイトを更新したとき、またはサイトを離れることを決定したときに、接続がダウンしていることを確認するにはどうすればよいですか?

これは私のセットアップです:

  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 issue tracker にファイルすることをお勧めします。

あなたが私たちに示しているよりも多くのことがあなたのアプリで起こっていると思います.あなたが私たちに示した方法はActiveRecordをまったく使用していないので、データベース接続をまったく必要としません. または、「データベース接続」とは、実際に Redis を意味するのでしょうか? もしそうなら、私はActiveRecordを想定していたので、この回答全体を無視してください。私も Redis の経験はありませんが、「データベース接続」が Redis を意味する場合、それは Redis の問題であり、Redis issue tracker に問題を報告してみてください。または、間違いなく、少なくともこの質問に「redis」のタグを付けて、redis を知っている人がそれを見ることができるようにします。

于 2014-11-05T22:11:53.593 に答える