style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Error: conexion remota PostgreSQL[SOLUCIONADO]

Buenos días,

Tengo establecidas dos conexiones para una misma aplicación:

1. localhost, 127.0.0.1(puerto 5432, es el que viene por defecto para postgres): Funciona correctamente.

2. Con otro servidor(192.168.x.xxx): En esta me salta el erro "org.postgresql.util.PSQLException: El intento de conexión falló.". Yendo un poco más alla me salta el error: "java.sql.SQLException: No suitable driver found for ", es decir, no se porque no me carga los drivers.

1. Lo que tengo instalado en las dos máquinas:

JVM: version 6 update 17.

PostgreSQL 8.4.

Windows XP version 5.1 running on x86.

2. Lo que he comprobado en el otro servidor:

En herramientras administrativas: Servicio iniciado, usuario postgres creado, posiblidad de crear un ODBC basado en postgreSQL, Controladores creados tanto ANSI como UNICODE.

Ping correcto.

La unica diferencia entre las dos aplicaciones es lo siguiente:

192.168x.xxx: URL_bd = "jdbc:postgresql://192.168.x.xxx:5432/obras";

localhost: URL_bd = "jdbc:postgresql://localhost:5432/obras_pruebas/";

Mi servidor de bbdd "postgreSQL 8.4" esta instalado con el mismo usuario y contraseña en las dos máquinas y desde la máquina "localhost" puedo ver y manipular(insert, update, select, ...) los datos de la bbdd del servidor 192.168.x.xxx.

En el archivo pg.hba.conf vienen estas líneas en las que se define el acceso:

# IPv4 local connections:
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5
host all all 0.0.0.0 0.0.0.0 md5
host all all 192.168.xx.xx/32 md5

En el archivo postgresql.conf:

# - Connection Settings -

listen_addresses = '*' # what IP address(es) to listen on;
# comma-separated list of addresses;
# defaults to 'localhost', '*' = all
# (change requires restart)
port = 5432 # (change requires restart)
max_connections = 100 # (change requires restart)

Segun estos dos archivos, en principio, debería poder conectarme, mediante pgadmin III de mi maquina local lo hago, correctamente pero desde la aplicación me sigue saltando el mismo error.

Un saludo y buen día.

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 ezamudio

restart

Si modificaste el postgresql.conf para ponerle listen_addresses=* lo reiniciaste después?

Para cargar los cambios hechos al pg_hba.conf solamente necesitas darle pg_ctl reload; supongo que le pusiste la IP del equipo desde donde quieres entrar (eso es lo que le debes poner, si estás poniendo máscara de 32 bits), o podrías ponerle simplemente 192.168.x.0/24 si quieres entrar desde cualquier equipo de la red local (ponle el número de la subred en vez de x). Si le estás poniendo la IP del equipo que corre PostgreSQL pues por eso es que no puedes entrar, porque definiste que puedes entrar desde localhost o desde el mismo equipo usando la IP externa.

Buenos días, Sí, reinicie

Buenos días,
Sí, reinicie el servicio/servidor.

host all all 127.0.0.1/32 md5
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5
host all all 0.0.0.0 0.0.0.0 md5
host all all 192.168.xx.xx/32 md5
host all all 192.168.0/8 md5
host all all 192.168.0/24 md5
host all all 192.168/24 md5

Así esta mi actual pg_hba. Tengo que hacer un par de pruebas pero creo que el problema esta en la instalación del postgre en la otra máquina. Si lo solucionó, ya os informaré.

Muchas gracias por contestar.

Un saludo y buen día.

Buenos días, Después de

Buenos días,

Después de unos días y algunas pruebas he comprobado que mi problema esta en java en la clase DriverManager, concretamente aquí:

Connection result = di.driver.connect(url, info);
                if (result != null) {
                    // Success!
                    println("getConnection returning " + di);
                    return (result);
                }

En la variable tanto info user como password son identicos para la conexion localhost como para la conexion remota, lo que cambia es la url:

conexion remota:
URL_bd = "jdbc:postgresql://192.168.0.252:5432/obras";

localhost:
URL_bd = "jdbc:postgresql:obras_pruebas";

Cuando llamo desde localhost sí entra en el if cuando le mando "192.168.0.252" no entra y por lo tanto me salta el error "org.postgresql.util.PSQLException: El intento de conexión falló.".

Agradeceré cualquier sugerencia.

Un saludo y buen día.

Imagen de ezamudio

user/pass

En qué momento le pones usuario y password?

Si tienes la típica instalación de PostgreSQL para desarrollo, entonces las conexiones locales se aceptan todas, la única validación (cuando mucho) es que el usuario que se conecta coincida con la base de datos a la que se quiere conectar (es decir que ese código que pusiste, lo ejecutas como usuario obras_pruebas), pero a veces ni eso se valida, simplemente valida que exista en PostgreSQL un usuario con el mismo nombre que el usuario de sistema operativo que estás usando y te deja conectarte a cualquier base de datos. Pero para conexiones remotas tienes que tener algún tipo de seguridad. Eso se ve en el archivo pg_hba.conf y quien maneje la base de datos que está en 192.168.0.252 es quien debe decirte si tan siquiera vas a poder o no. Pero normalmente lo que necesitas agregar de parámetros son usuario y password, y si lo vas a hacer por medio de DriverManager (IMHO la peor manera de usar JDBC) entonces debes pasarle usuario y password por medio de un Properties al DriverManager para que se pueda autenticar con el servidor.

usuario y password

Buenas tardes,

Muchas gracias por responder.

mi cadena de conexion es la siguiente:

 
public static java.sql.Connection conexion;
.
.
.
public synchronized static void inicializar() throws Exception {

        try {

            // Cargamos o controlador ODBC
            if (conexion == null || conexion.isClosed()) {
                Class.forName(controlador).newInstance();
                conectar(); // conectar coa fonte de datos
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
.
.
.

public synchronized static void conectar() throws java.sql.SQLException {
        // Conectar coa BD
        try {

            //Establecemos la conexión.
            conexion = DriverManager.getConnection(URL_bd, usuario, contrasinal);
            //conexion = MiDriverManager.getConnection(URL_bd, usuario, contrasinal);

            DriverManager.setLogWriter(new java.io.PrintWriter(System.out));

           
            //Commit a true
            conexion.setAutoCommit(true);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

Mis usuarios de postgres y windows no tienen nada en comun, bueno sí, que son personales e instransferibles.

Tengo acceso al pg_hba.conf de servidor 192.168.0.252, no puedo modificarlo ya que no soy admin de esa máquina pero si que puedo pedirle, como ya he hecho, al administrador que cambie los parametros del archivo de configuración por los siguientes:

host all all 127.0.0.1/32 md5
host all all 127.0.0.1/32 md5
host all all 0.0.0.0/0 md5
host all all 0.0.0.0 0.0.0.0 md5
host all all 192.168.xx.xx/32 md5
host all all 192.168.0/8 md5
host all all 192.168.0/24 md5
host all all 192.168/24 md5

Con esto "host all all 0.0.0.0/0 md5" ya debería tener acceso toda la red sabiendo cual es el usuario y contraseña.

Desde el pgAdmin de localhost y la pestaña "Services" del netbeans accedo sin problemas a los datos del servidor 192.168.0.252 .

Me acaban de informar en otro foro que mi version del postgres 8.4, da muchos problemas con las conexiones remotas y me han sugerido que me actualice a una version inferior. Espero que esto funcione porque ya no se que más puedo configurar, cambiar...

Un saludo y buen día.

Imagen de ezamudio

8.4

Yo uso 8.4 en producción y no tengo problema alguno con conexiones remotas.

Si las cadenas de pg_hba.conf están definidas tal cual las pusiste en tu post, la mayoría (si no es que todas) están mal. Debes tener:

host all all 192.168.0.0/24 md5

Ya has intentado conectarte con el programa psql? Si ya puedes con ese programa pero no puedes desde JDBC entonces el problema es algo con el driver de JDBC o con la cadena de conexión que usas en Java, etc. Pero si no puedes con psql el problema está en la configuración. Recuerden que después de editar el pg_hba.conf hay que mandar una señal a PostgreSQL para que lea nuevamente la config, o de plano reiniciarlo, pero con un pg_ctl reload debe ser suficiente.

conexion por psql

Buenas tardes,

He podido conectarme con psql. Antes has escrito si lo vas a hacer por medio de DriverManager (IMHO la peor manera de usar JDBC) me podrías escribir cualquier cosa, aunque sólo sea una palabra clave, un programa, una sentencia, cualquier grupo de letras que pueda poner en los buscadores y a partir intentar más soluciones para poder conectarme a mi bbdd remota.

Un saludo y buen día.

pool de conexiones

Buenas tardes,

He probado a conectarme del siguiente modo pero me sigue saltando el mismo error:

public static java.sql.Connection  conexion;
[...]
if (pool == null) {
               
               pool = new Jdbc3PoolingDataSource();

                pool.setPortNumber(5432);
                pool.setUser("usuario");
                pool.setPassword("password");
                pool.setMaxConnections(100);
                pool.setServerName("192.162.0.252");
                pool.setDatabaseName("obras");

            }
           
            conexion = pool.getConnection();
            pool.setLogWriter(new java.io.PrintWriter(System.out));
           
            //Commit a true
            conexion.setAutoCommit(true);

Un saludo y buen día.

Imagen de ezamudio

Pool

No conozco la naturaleza de tu aplicación pero por lo general un pool de conexiones es buena idea. O un DataSource al menos, al que le pidas las conexiones sin tener que volver a configurar cada una; el DataSource guarda los datos de las conexiones que debe crear. Y pasar de un DataSource común y corriente a un pool de conexiones ya es muy transparente usando algo como DBCP o c3p0 (en mi blog tengo alguna entrada al respecto).

En tu ejemplo de Pool de PostgreSQL supongo que el error te sale al querer obtener una conexión del pool? Me parece muy extraño que el error ocurra al momento de conectarte con JDBC pero que no tengas problemas con psql. Estás usando el puerto default, y supongo que el psql lo corres solamente con los 3 parámetros necesarios: psql -dobras -Uusuario -h192.168.0.252 y te pide el password y entras. Sólo que estés usando alguna versión del driver JDBC de PostgreSQL que no sea la adecuada para el servidor que tienen... usa la de JDBC3 para la versión 8.4 y no deberías tener broncas.

Re: Pool

Buenos días,

Gracias por las recomendaciones ezamundio, les echaré un vistazo. Mi aplicación inicialmente es sencillita sólo accede a esa base de datos para obtener cuatro datos y actualizar otros cuatros pero pretendo que se convierta en un pequeño monstruo y todo lo que supongan mejoras, tengo que implementarlas.

En tu ejemplo de Pool de PostgreSQL supongo que el error te sale al querer obtener una conexión del pool?

Sí , exactamente en la línea conexion = pool.getConnection();

Este error es muy raro, además del psql y el pgAdmin puedo conectarme desde la pestaña services de mi netbeans.

Ayer hice la prueba en casa con dos de mis ordenadores que no estan en una red local como los del trabajo y no tuve ningun problema, lanzando la misma aplicación. El SO del servidor remoto es un Windows server 2003, en casa mi "servidor" era un windows 7. En el psql o Sql Shell me pide Server, Database, Port y Username pero no la password y conecta, en las dos máquinas el superusuario postgres tiene la misma contraseña, no se si influye.

He probado con tres versiones del jdbc:

JDBC4 que es la recomendada para mi JVM.

JDBC3 porque esta en uso y no me funcionaba con JDBC4

jdbc1 por probar cualquier cosa, la desesperación es lo ultimo que se pierda.

Ayer en casa lo hice con JDBC4 y sin problemas.

Un saludo y buen día.

Solución.

Buenos días,

Después de muchas horas y muchas pruebas...

El problema: como esta configurado el proxy en la red en la que trabajo.

La solución: Abir internet explorer, Herramientas > Opciones de Internet > Pestaña Conexiones > Botón Configuración de LAN > Botón Avanzadas > Panel Excepciones > escribir en el textBox la ip del equipo al que quieras acceder.

Un saludo y buen día.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">