Reputation: 1234
I have the setup of my Rails app as following:
The problem is, after some idle time, when I make a new request to the Rails app, it gives me the following error:
ActiveRecord::StatementInvalid (PGError: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
From what I have researched, it seems that the database connections are dropped after some timeout by Postgres. During this time, from the Rails side,
It means that I will always experience the first connection error then will have all normal operation again, which is very serious in my case since I'd like to deliver a non-error response to my client.
I have looked in following questions and answers, but they do not seem to be appropriate for my case:
Do you have any advice in order to make my app free from db connection errors? Thank you.
Upvotes: 7
Views: 4367
Reputation: 5112
I faced this error while going live on production.I just opened my production console and tried to connect the PG db and it worked.
RAILS_ENV=production rails c
User.new
and it worked after this.
hope it helps someone ;)
Upvotes: 0
Reputation: 1646
We had this problem on Heroku, a lot. As a hackish solution, here's what we did. Put the following in your 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
Basically, tests the connection on each controller hit. Scalable? Not really. But it fixed the problem for us.
Upvotes: 5
Reputation: 5051
In database.yml, do you have the reconnect: true
option set for the connection? ex:
production:
adapter: postgresql
database: myapp
username: deploy
password: password
reconnect: true
I'm not sure about the specific error, but without this option you need to handle a class of expected db errors yourself.
Upvotes: 1