org.postgresql.util.PSQLException: An I/O error occured while sending to the backend.

No creo que este problema sea al 100% relacionado con Java pero lo pongo de todas formas en espera de algo de ayuda.

Tengo una aplicación basada en Java, JPA, TopLink Essentials y una DB Postgresql. La mitad de los usuarios que usan esta aplicación estan conectados al servidor por red local y la otra mitad de manera remota. Los usuarios locales no han experimentado problemas con la aplicación pero a los usuarios remotos se les bloquea intermitentemente la aplicación, algunas veces por unos segundos y otras veces por varios minutos.

La unica excepción que me lanza la aplicación es:

org.postgresql.util.PSQLException: An I/O error occured while sending to the backend.

Al mismo tiempo, el log de Postgresql muestra el siguiente mensaje:

PDT LOG:  unexpected EOF on client connection
PDT LOG:  could not receive data from client: No connection could be made because the target machine actively refused it.

El servidor esta bastante sobrado en cuestion de CPU, RAM y ancho de banda por lo que no creo que sea cuestion del servidor o la conexión en si. Ademas he dejado que el framework de persistencia maneje las conexiones automaticamente por lo que no creo que sea algun defecto en el codigo. ¿Como puedo diagnosticar la falla y ponerle solución?

Saludos y gracias por su ayuda.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de Nopalin

Logger

Pues tienes que ir haciendo un rastreo del error.

Cuando te refieres a que dejaste que el toplink manejara las conexiones, te refieres a que cada cliente tiene estas librerias y se conectan directamente a la base de datos? o cada cliente se conecta a un servidor atravez de algun servicio (ya sea rmi, soap, etc) y este servidor es el único que se conecta a la base de datos?

Pero bueno, en cualquiera de los dos escenarios tienes que ver la excepcion que se genera en el cliente y ya con eso se puede tener un poco mas de información. Así a ojos de buen cubero la impresión que me da es que hay fallas en la conexión con los equipos remotos, ya que dices que los de la red local nunca han fallado.

sobres

Imagen de ezamudio

acceso por red

Parece evidente que no puedes conectarte via red al servicio de PostgreSQL. Si ya intentaste un telnet y con eso sí puedes entonces podría ser otra cosa, pero No connection could be made because the target machine actively refused it suena simplemente a que el equipo donde reside PostgreSQL te está negando la conexión desde el equipo donde quieres hacerla.

Lo primero en estos casos es hacer un telnet al host y puerto donde está PostgreSQL para comprobar que hay conectividad. Si no la hay (que estoy seguro será el caso), tienes que averiguar por qué; puede ser que PostgreSQL no está configurado para recibir conexiones en ese puerto o simplemente no tiene el listener de red habilitado, o tal vez tienes iptables o algún otro firewall de software activado en el equipo. De ser así, definitivamente no es un problema relacionado con Java.