我已经创建了一个在Rails 4中使用Live方法的应用程序。但是当我使用它时,每次刷新都会继续进行一次连接,直到它达到与DB的最大连接数,然后才会挂起并永远加载。
如果用户刷新网站或决定退出连接,我该怎么做才能确保连接失效?
这是我的设置:
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
答案 0 :(得分: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的人可能会看到它。