2010-12-30 17 views
19

Tengo una instancia local en ejecución de PostgreSql en una máquina Linux. Cuando utilizo el comando psql del shell, tuve éxito al iniciar sesión sin ningún problema. Necesito conectarme a PostgreSql a través de JDBC, pero no sé exactamente qué debo pasar como parámetro url a DriverManager.getConnection().Conexión a la instancia local de PostgreSql con JDBC

Debería comenzar con jdbc:postgresql:, pero ¿qué sigue?

El grupo de sistemas me dijo que se había creado una base de datos con el nombre de usuario. p.ej. si mi usuario es jutky una base de datos nombrado jutky fue creado, pero cuando intento abrir una conexión a jdbc:postgresql:jutky me sale un error

org.postgresql.util.PSQLException: FATAL: password authentication failed for user "jutky" :(

Otros detalles

Cuando me conecto a través psql No se me pide la contraseña, así que cuando intento iniciar sesión a través de JDBC, paso una cadena vacía como contraseña: ¿es correcta, o debo pasar null o algo así?

Cuando escribo psql --help en la cáscara veo entre el resto de esta línea:

Connection options: 
    -h, --host=HOSTNAME  database server host or socket directory (default: "/var/run/postgresql") 

por lo que entiendo que me conecto a través de un PostgreSql socket directory, hace algo que importa a la cadena de URL en el JDBC?


EDITAR

primer lugar gracias por las respuestas.

Segundo: no es la primera vez que uso JDBC y, en particular, no la primera vez que me conecto a PostgreSql desde JDBC, así que conozco las reglas generales y he leído la documentación. Sin embargo, en el caso descrito no estoy seguro de cómo exactamente debo construir la cadena de conexión si la instancia se está ejecutando a través del socket directory y qué contraseña debo proporcionar. Porque cuando inicio sesión a través del psql no me piden ninguna contraseña.

Gracias de antemano.

Respuesta

23

Además de otras respuestas en cuenta que, por defecto Postgres está configurado para aceptar conexiones a través de conectores Unix con la autenticación basada en su cuenta del sistema operativo, por eso psql funciona bien y no requiere la contraseña

Las conexiones JDBC se realizan a través de TCP/IP con autenticación de contraseña, por lo que debe modificar pg_hba.conf en consecuencia. Por ejemplo, esta línea permite conexiones TCP/IP en la misma máquina a todas las bases de datos para todos los usuarios con autenticación de contraseña:

host all   all   127.0.0.1/32   md5 

Después de agregar esta línea jdbc:postgresql:databasename debería funcionar.

EDIT: No se puede crear una conexión JDBC sobre un socket Unix ya que el controlador PostgreSQL JDBC solo puede funcionar sobre TCP/IP. La contraseña que utiliza al crear la conexión JDBC es la contraseña asignada a su usuario. Si no lo tiene, puede asignarlo, por ejemplo, utilizando el comando ALTER USER. Ver 19.3. Authentication methods.

Consulte también:

+0

Le pedí al grupo del sistema que verificara el problema. Gracias por el consejo. – jutky

+1

También asegúrese de que listen_address = '*' esté habilitado en postgresql.conf. De lo contrario, la conexión TCP/IP no será posible en absoluto (que es lo que JDBC está usando, incluso con una conexión local) –

+0

@jutky: Actualizado. – axtavt

8

Todo está explicado en official documentation.

Ésta es la parte pertinente:

String url = "jdbc:postgresql://localhost/test?user=fred&password=secret&ssl=true"; 
Connection conn = DriverManager.getConnection(url); 
+0

ver la edición de la cuestión. – jutky

Cuestiones relacionadas