2016-07-08 6 views
1

(mit com.impossibl.postgres.api.jdbc)Kein passender Treiber gefunden (jdbc: pgsql)

Ich habe Probleme, eine Verbindung zu einer Datenbank zur Gründung, wenn ich etwas aus der hosts-Datei verweisen.

Es scheint jedoch mit 'localhost' zu arbeiten.

Ich habe dies innerhalb eines Docker-Container ausgeführt (auf dem gleichen Host-Rechner wie ein Postgres-Container). Wenn ich die Hosts IP-Adresse verwenden oder die IP des Postgres Behälters fein es funktioniert, aber wenn ich versuche, die Containernamen zu verwenden, um es mir

java.sql.SQLException: No suitable driver found for jdbc:pgsql://postgres_container:5432/db 

Der Behälter mit dem Postgres Behälter verbunden war gibt, wenn es ausgeführt wurde, und der Datensatz befindet sich in der Host-Datei des Containers genau so, wie er sein sollte.

Kann dieser Treiber die Hosts-Datei nicht referenzieren? Wenn ja, warum funktioniert es mit localhost?

Antwort

1

Wenn es mit localhost funktioniert, aber nicht mit einem anderen Hostnamen, dann ist es wie ein klingt Fehler in diesem Treiber, da es scheinbar die URL fälschlicherweise ablehnt, indem er null zurückgibt (was zu DriverManager bedeutet, "dieser Treiber versteht diese URL nicht") anstatt die URL zu akzeptieren und eine SQLException (die zu DriverManager bedeutet, "this Der Treiber versteht diese URL, aber etwas stimmt nicht. "(z. B. Syntaxfehler, Problem beim Verbinden usw.)

Wenn ein JDBC-Treiber ein bestimmtes URL-Format akzeptiert, soll sie es unter allen Umständen zu akzeptieren sein, von JDBC 4.2 Abschnitt 9.2:

Wenn die DriverManager versuchen, eine Verbindung aufzubauen, es, dass Fahrer connect-Methode aufruft und Übergibt dem Treiber die URL. Wenn die Treiberimplementierung die URL versteht, gibt sie ein Objekt Connection zurück oder wirft eine SQLException, wenn eine Verbindung nicht mit der Datenbank hergestellt werden kann. Wenn die Driver Implementierung die URL nicht versteht, gibt sie null zurück.

Insbesondere bei the code suchen, es sieht aus wie der URL-Parser in pgjdbc-ng nicht Unterstrichen in Host-Namen wie und daher kehrt null, die dann verursacht null vom Driver zurückgegeben werden, anstatt eine SQLException zu werfen.

private static final Pattern URL_PATTERN = 
    Pattern.compile("jdbc:pgsql:(?://((?:[a-zA-Z0-9\\-\\.]+|\\[[0-9a-f\\:]+\\])(?:\\:(?:\\d+))?(?:,(?:[a-zA-Z0-9\\-\\.]+|\\[[0-9a-f\\:]+\\])(?:\\:(?:\\d+))?)*)/)?((?:\\w|-|_)+)(?:[\\?\\&](.*))?"); 

Workaround: Verwenden Sie einen Hostnamen ohne Unterstriche oder eine IP-Adresse.

Um die eigentlichen Probleme zu bekommen angesprochen, ich schlage vor, Sie erstellen ein Problem auf https://github.com/impossibl/pgjdbc-ng

+0

das war es, danke – One

0

Das klingt für mich wie ein Umgebungsproblem im Zusammenhang mit der Docker Container-Konfiguration. Dem Benutzerklassenpfad "docker" fehlt möglicherweise das Treiberverzeichnis oder die Dockercontainerumgebung verweist nicht auf das Verzeichnis oder den Treiber.

ich verdoppeln alle Einstellungen in https://docs.docker.com/engine/examples/postgresql_service/ aufgeführten würde überprüfen und Kommandozeilen-Tests durchführen, usw., bis Sie es nach unten verfolgen.

+0

ich nicht glauben, dass es ein Docker verwandtes Problem, wenn ich laufen „getent hosts localhost | awk‚{print $ 1}‘“, wenn eine bekommen Ergebnis, gleich, wenn ich den Containernamen und nicht localhost übergebe. Außerdem, wenn ich das Programm lokal und manuell etwas (anders als localhost) in der hosts-Datei setzen, bekomme ich den gleichen Fehler. Es sieht so aus, als würde der Treiber nicht aus der hosts Datei oder so etwas lesen. – One

-1

Versuchen Sie dieses: (Sie brauchen nicht Class.forName) und ändern pgsql -bis-postgresql

String url = "jdbc:postgresql://localhost:5432/db"; 
Connection conn = DriverManager.getConnection(url, "name", "pass"); 
+0

Das ist für einen anderen PostgreSQL JDBC-Treiber. – Andreas