我的Rails应用程序设置如下:
问题是,在一些空闲时间之后,当我向Rails应用程序发出新请求时,它会给我以下错误:
ActiveRecord::StatementInvalid (PGError: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
根据我的研究,似乎在Postgres超时后数据库连接被删除。在此期间,从Rails方面,
这意味着我将始终遇到第一个连接错误,然后再次进行所有正常操作,这在我的情况下非常严重,因为我想向我的客户端发送非错误响应。
我查看了以下问题和答案,但它们似乎不适合我的情况:
为了让我的应用免受数据库连接错误的影响,您有什么建议吗?谢谢。
答案 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
并且在此之后有效。
希望它对某人有帮助;)