Rails的生产:一些超时后“PGError服务器意外关闭了连接”

我有我的Rails应用程序的设置如下:

  • Rails的:3.0.5(下Apache代理)在RHEL 5.6上运行
  • Postgres的:8.4,Windows Server 2008上运行的2台服务器在同一个局域网上。

问题是,一些空闲时间后,当我做出Rails应用程序的新请求,它给了我下面的错误:

ActiveRecord::StatementInvalid (PGError: server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.

从我的研究,似乎数据库连接是由一些Postgres的超时后丢弃。 在此期间,从滑轨侧

  • 如果我做出的Rails(1请求)的请求,它会显示连接错误如上
  • 如果我再拍请求的Rails(第二请求)时,Rails似乎重新连接到Postgres的和正常运行。

这意味着我将永远体验到第一次连接错误,那么将再次有一切正常操作,这是在我的情况很严重,因为我想提供一个非错误响应我的客户。

我都对着下面的问题和答案,但他们似乎并不适合我的情况:

  • “PGError:到服务器的连接”后闲置(Ubuntu的为DB服务器)
  • 如何使用PostgreSQL中tcp_keepalives设置? (在MacOS上保持连接)

你有什么建议,以便使我的应用程序从数据库连接错误免费的吗? 谢谢。

--------------解决方案-------------

我们有在Heroku上,有很多这个问题。 作为一个hackish的解决方案,这里就是我们所做的。 把下面的在你的ApplicationController:

prepend_before_filter :confirm_connection
def confirm_connection
c = ActiveRecord::Base.connection
begin
c.select_all "SELECT 1"
rescue ActiveRecord::StatementInvalid
ActiveRecord::Base.logger.warn "Reconnecting to database"
c.reconnect!
end
end

基本上,测试对每个控制器命中的连接。 可扩展的? 不是真的。 但它解决了问题我们。

在database.yml中,你有没有reconnect: true选项设置为连接? 例如:

production:
adapter: postgresql
database: myapp
username: deploy
password: password
reconnect: true

我不知道具体的错误,但没有这个选项,你需要处理的一类自己预期的DB错误。

分类:Ruby on Rails的 时间:2012-08-15 人气:1
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 1.082 (s). 10 q(s)