Anh Nguyen
Anh Nguyen

Reputation: 1234

Rails produces "PGError: server closed the connection unexpectedly" after some timeout

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

Answers (3)

Milind
Milind

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

Irongaze.com
Irongaze.com

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

Woahdae
Woahdae

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

Related Questions