2011-11-09 29 views
6

tengo la configuración de mi aplicación Rails de la siguiente manera:rieles produce "PGError: servidor ha cerrado la conexión de forma inesperada" después de algún tiempo de espera

  • Rieles: 3.0.5 (bajo proxy de Apache) que se ejecuta en RHEL 5.6
  • Postgres: 8.4, ejecutándose en Windows Server 2008 Los 2 servidores están en la misma LAN.

El problema es que, después de algún tiempo de inactividad, cuando hago una nueva solicitud a la aplicación Rails, me da el siguiente error:

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

Por lo que he investigado, parece que la las conexiones de la base de datos se eliminan después de un tiempo de espera por Postgres. Durante este tiempo, desde el lado de los carriles,

  • si hago una petición a los carriles (primera solicitud), se mostrará el error de conexión que el anterior
  • si hago otra petición a los carriles (segunda petición), Rails parece reconectarse con Postgres y funciona correctamente.

Significa que siempre experimentaré el primer error de conexión y luego tendré todo el funcionamiento normal nuevamente, lo cual es muy grave en mi caso ya que me gustaría entregar una respuesta sin errores a mi cliente.

He mirado en el seguimiento de preguntas y respuestas, pero no parecen ser apropiados para mi caso:

¿Tiene algún consejo para que mi aplicación esté libre de errores de conexión de db? Gracias.

+0

Estoy obteniendo el mismo error mientras uso postgresql con heroku – Salil

+0

Es normal que las conexiones desaparezcan. No es normal que Rails lo trate tan desvergonzadamente. Compruebe la implementación del controlador de su base de datos (adaptador) de 'verify!' Y 'active?'; normalmente 'ActiveRecord :: ConnectionAdapters :: ConnectionPool' da al adaptador la oportunidad de volver a conectar cualquier conexión obsoleta inmediatamente antes de verificarlo desde el grupo. ¿Qué gema estás usando para Postgres? – vladr

Respuesta

1

En database.yml, ¿tiene la opción reconnect: true establecida para la conexión? por ejemplo:

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

no estoy seguro sobre el error específico, pero sin esta opción se necesita para manejar una clase de errores esperados db usted mismo.

4

Tuvimos este problema en Heroku, mucho. Como una solución hackish, esto es lo que hicimos. Ponga lo siguiente en su 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 

Básicamente, las pruebas de la conexión en cada golpe controlador. ¿Escalable? Realmente no. Pero solucionó el problema para nosotros.

Cuestiones relacionadas