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

时间:2011-11-09 03:32:54

标签: ruby-on-rails windows postgresql timeout connection

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

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

问题是,在一些空闲时间之后,当我向Rails应用程序发出新请求时,它会给我以下错误:

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

根据我的研究,似乎在Postgres超时后数据库连接被删除。在此期间,从Rails方面,

  • 如果我向Rails(第一个请求)发出请求,它将显示上面的连接错误
  • 如果我向Rails发出另一个请求(第二个请求),Rails似乎重新连接到Postgres并正常运行。

这意味着我将始终遇到第一个连接错误,然后再次进行所有正常操作,这在我的情况下非常严重,因为我想向我的客户端发送非错误响应。

我查看了以下问题和答案,但它们似乎不适合我的情况:

为了让我的应用免受数据库连接错误的影响,您有什么建议吗?谢谢。

3 个答案:

答案 0 :(得分:4)

我们在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

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

答案 1 :(得分:1)

在database.yml中,您是否为连接设置了reconnect: true选项?例如:

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

我不确定具体的错误,但如果没有这个选项,你需要自己处理一类预期的db错误。

答案 2 :(得分:0)

生产上线时遇到此错误。我刚刚打开生产控制台并尝试连接PG数据库,

 RAILS_ENV=production rails c
 User.new

并且在此之后有效。

希望它对某人有帮助;)