web-dev-qa-db-fra.com

Connexion à une instance locale de PostgreSql avec JDBC

J'ai une instance locale en cours d'exécution de PostgreSql sur une machine Linux. Lorsque j'utilise la commande psql du Shell, je réussis à me connecter sans problème. Je dois me connecter au PostgreSql via le JDBC, mais je ne sais pas exactement ce que dois-je passer en tant que paramètre url à DriverManager.getConnection().

Il devrait commencer par jdbc:postgresql: mais que se passe-t-il ensuite?

Le groupe système m'a dit qu'une base de données avec a été créée comme nom d'utilisateur. par exemple. si mon utilisateur est jutky une base de données nommée jutky a été créée, mais lorsque j'essaie d'ouvrir une connexion à jdbc:postgresql:jutky Je reçois une erreur

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

Informations supplémentaires

Lorsque je me connecte via le psql je ne suis pas invité à entrer le mot de passe, donc lorsque j'essaie de me connecter via JDBC, je passe une chaîne vide comme mot de passe - est-ce correct, ou dois-je passer null ou quelque chose?

Quand je tape psql --help dans le Shell je vois parmi les autres cette ligne:

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

Je comprends donc que je me connecte à PostgreSql via un socket directory, est-ce important pour la chaîne d'URL dans le JDBC?


MODIFIER

Merci d'abord pour les réponses.

Deuxièmement: ce n'est pas la première fois que j'utilise JDBC et en particulier pas la première fois que je me connecte au PostgreSql depuis JDBC, donc je connais les règles générales et j'ai lu les documentations. Cependant, dans le cas décrit, je ne sais pas exactement comment dois-je construire la chaîne de connexion si l'instance s'exécute via le socket directory et quel mot de passe dois-je fournir. Parce que lorsque je me connecte via le psql je ne suis pas du tout invité à saisir mon mot de passe.

Merci d'avance.

21
jutky

En plus d'autres réponses, notez que par défaut Postgres est configuré pour accepter les connexions via les sockets Unix avec une authentification basée sur votre compte de système d'exploitation, c'est pourquoi psql fonctionne correctement et ne nécessite pas de mot de passe.

Les connexions JDBC sont établies sur TCP/IP avec authentification par mot de passe, vous devez donc modifier pg_hba.conf en conséquence. Par exemple, cette ligne autorise les connexions TCP/IP de la même machine à toutes les bases de données pour tous les utilisateurs avec authentification par mot de passe:

Host    all         all         127.0.0.1/32          md5

Après avoir ajouté cette ligne jdbc:postgresql:databasename devrait marcher.

EDIT: Vous ne pouvez pas créer une connexion JDBC sur un socket Unix car le pilote JDBC PostgreSQL ne peut fonctionner que sur TCP/IP. Le mot de passe que vous utilisez lors de la création d'une connexion JDBC est le mot de passe attribué à votre utilisateur. Si vous ne l'avez pas, vous pouvez l'attribuer, par exemple, en utilisant ALTER USER commande. Voir 19.3. Méthodes d'authentification .

Voir aussi:

28
axtavt

Tout est expliqué dans documentation officielle .

Ceci est la partie pertinente:

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