2010-12-30 12 views
19

Ich habe eine laufende lokale Instanz von PostgreSql auf einem Linux-Rechner. Wenn ich den psql Befehl von der Shell verwende, kann ich mich ohne Probleme einloggen. Ich muss über den JDBC eine Verbindung zum PostgreSql herstellen, aber ich weiß nicht, was genau ich als url Parameter an DriverManager.getConnection() übergeben soll.Verbinden mit lokaler Instanz von PostgreSql mit JDBC

Es sollte mit jdbc:postgresql: beginnen, aber was geht als nächstes?

Ich wurde von der Systemgruppe gesagt, dass eine Datenbank mit wie Benutzername erstellt wurde. z.B. wenn mein Benutzer jutky ein db namens jutky wurde erstellt, aber wenn ich versuche, eine Verbindung zu jdbc:postgresql:jutky öffnen Ich erhalte eine Fehlermeldung

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

Zusatzinfo

Als ich anmelden über die psql Ich werde nicht zur Eingabe des Passworts aufgefordert, wenn ich versuche, mich über JDBC anzumelden, gebe ich eine leere Zeichenfolge als Passwort - ist es richtig, oder sollte ich null oder etwas passieren?

Wenn ich tippe psql --help in der Schale ich unter anderem sehen diese Zeile:

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

So verstehe ich, dass ich zu PostgreSql über eine socket directory verbinden, geht das etwas an die URL-Zeichenfolge in der JDBC wichtig?


EDIT

Erster Dank für die Antworten.

Zweitens: es ist nicht das erste Mal, dass ich JDBC benutze und insbesondere nicht das erste Mal, dass ich eine Verbindung mit der PostgreSql von JDBC, so kenne ich die allgemeinen Regeln und ich habe die Dokumentationen gelesen. Im beschriebenen Fall bin ich jedoch nicht sicher, wie genau ich die Verbindungszeichenfolge aufbauen soll, wenn die Instanz über die socket directory läuft und welches Passwort ich bereitstellen soll. Denn wenn ich mich über die psql anmelde, werde ich gar nicht nach einem Passwort gefragt.

Vielen Dank im Voraus.

Antwort

23

Neben anderen Antworten beachten Sie, dass standardmäßig Postgres-Verbindungen über Unix-Sockets mit Authentifizierung basierend auf dem Betriebssystemkonto akzeptieren konfiguriert ist, das ist, warum psql funktioniert gut und erfordert kein Passwort.

JDBC-Verbindungen werden über TCP/IP mit Kennwortauthentifizierung hergestellt, daher müssen Sie pg_hba.conf entsprechend ändern. Zum Beispiel ermöglicht diese Zeile TCP/IP-Verbindungen von der gleichen Maschine auf alle Datenbanken für alle Benutzer mit Passwort-Authentifizierung:

host all   all   127.0.0.1/32   md5 

Nachdem Sie die Zeile jdbc:postgresql:databasename funktionieren soll.

EDIT: Sie können keine JDBC-Verbindung über Unix-Socket erstellen, da der PostgreSQL JDBC-Treiber nur über TCP/IP funktionieren kann. Das Passwort, das Sie beim Erstellen der JDBC-Verbindung verwenden, ist das Ihrem Benutzer zugewiesene Passwort. Wenn Sie es nicht haben, können Sie es z. B. mit dem Befehl ALTER USER zuweisen. Siehe 19.3. Authentication methods.

Siehe auch:

+0

Ich habe die Systemgruppe gebeten, dieses Problem zu überprüfen. Danke für den Hinweis. – jutky

+1

Stellen Sie außerdem sicher, dass listen_address = '*' in postgresql.conf aktiviert ist. Andernfalls ist die TCP/IP-Verbindung überhaupt nicht möglich (was JDBC auch bei einer lokalen Verbindung verwendet) –

+0

@jutky: Aktualisiert. – axtavt

8

Es ist alles in official documentation erklärt.

Dies ist der relevante Teil:

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

sehen die Bearbeitung der Frage. – jutky

Verwandte Themen