【问题标题】:Rails produces "PGError: server closed the connection unexpectedly" after some timeoutRails 在超时后产生“PGError:服务器意外关闭连接”
【发布时间】:2011-12-24 23:48:50
【问题描述】:

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

  • Rails:3.0.5(在 Apache 代理下)在 RHEL 5.6 上运行
  • 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 并正常运行。

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

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

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

【问题讨论】:

  • 我在使用 postgresql 和 heroku 时遇到同样的错误
  • 连接消失是正常的。 Rails 如此不礼貌地对待它是不正常的。检查您的数据库驱动程序(适配器)对verify!active? 的实现;通常ActiveRecord::ConnectionAdapters::ConnectionPool 使适配器有机会在将任何陈旧连接从池中检出之前立即重新连接它。您将哪个 gem 用于 Postgres?

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


【解决方案1】:

我在生产上线时遇到了这个错误。我刚刚打开我的生产控制台并尝试连接 PG 数据库,它工作正常。

 RAILS_ENV=production rails c
 User.new

在此之后它起作用了。

希望对某人有所帮助;)

【讨论】:

    【解决方案2】:

    我们在 Heroku 上遇到过很多这样的问题。作为一个骇人听闻的解决方案,这就是我们所做的。将以下内容放入您的 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
    

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-31
        • 2012-09-29
        • 1970-01-01
        相关资源
        最近更新 更多