Die berüchtigte java.sql.SQLException: Kein passender Treiber gefunden

88

Ich versuche, einer vorhandenen Tomcat 5.5-Anwendung eine datenbankfähige JSP hinzuzufügen (GeoServer 2.0.0, falls dies hilfreich ist).

Die App selbst spricht gut mit Postgres, also weiß ich, dass die Datenbank aktiv ist, der Benutzer darauf zugreifen kann, all das gute Zeug. Ich versuche, eine Datenbankabfrage in einer JSP durchzuführen, die ich hinzugefügt habe. Ich habe das Konfigurationsbeispiel im Tomcat-Datenquellenbeispiel ziemlich sofort verwendet. Die erforderlichen Taglibs befinden sich an der richtigen Stelle. Wenn ich nur die Taglib-Refs habe, treten keine Fehler auf, sodass diese JARs gefunden werden. Der postgres jdbc-Treiber postgresql-8.4.701.jdbc3.jar befindet sich in $ CATALINA_HOME / common / lib.

Hier ist die Spitze der JSP:

<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<sql:query var="rs" dataSource="jdbc/mmas">
  select current_validstart as ValidTime from runoff_forecast_valid_time
</sql:query>

Der relevante Abschnitt aus $ CATALINA_HOME / conf / server.xml, in dem <Host>sich wiederum befindet <Engine>:

<Context path="/gs2" allowLinking="true">
  <Resource name="jdbc/mmas" type="javax.sql.Datasource"
      auth="Container" driverClassName="org.postgresql.Driver"
      maxActive="100" maxIdle="30" maxWait="10000"
      username="mmas" password="very_secure_yess_precious!"
      url="jdbc:postgresql//localhost:5432/mmas" />
</Context>

Diese Zeilen sind die letzten im Tag in webapps / gs2 / WEB-INF / web.xml:

<resource-ref>
  <description>
     The database resource for the MMAS PostGIS database
  </description>
  <res-ref-name>
     jdbc/mmas
  </res-ref-name>
  <res-type>
     javax.sql.DataSource
  </res-type>
  <res-auth>
     Container
  </res-auth>
</resource-ref>

Zum Schluss die Ausnahme:

   exception
    org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver"
    [...wads of ensuing goo elided]
Rick Wayne
quelle
Siehe meine Antwort: stackoverflow.com/a/38656446/632951
Pacerier

Antworten:

106

Die berüchtigte java.sql.SQLException: Kein passender Treiber gefunden

Diese Ausnahme kann grundsätzlich zwei Ursachen haben:

1. Der JDBC-Treiber ist nicht geladen

Sie müssen sicherstellen, dass der JDBC-Treiber im eigenen /libOrdner des Servers abgelegt ist .

Wenn Sie tatsächlich keine vom Server verwaltete Verbindungspool-Datenquelle verwenden, sondern manuell DriverManager#getConnection()in WAR herumspielen, müssen Sie den JDBC-Treiber in WARs platzieren /WEB-INF/libund ausführen.

Class.forName("com.example.jdbc.Driver");

.. in Ihrem Code vor dem ersten DriverManager#getConnection()Aufruf, wobei Sie sicherstellen, dass Sie nichts verschlucken / ignorieren, ClassNotFoundExceptionwas von ihm geworfen werden kann, und den Code-Fluss fortsetzen, als ob nichts Außergewöhnliches passiert wäre. Siehe auch Wo muss ich den JDBC-Treiber für den Tomcat-Verbindungspool platzieren?

2. Oder die JDBC-URL hat eine falsche Syntax

Sie müssen sicherstellen, dass die JDBC-URL der JDBC-Treiberdokumentation entspricht, und berücksichtigen, dass normalerweise zwischen Groß- und Kleinschreibung unterschieden wird. Wenn die JDBC - URL nicht zurück truefür Driver#acceptsURL()für eine des geladenen Treiber, dann werden Sie auch genau diese Ausnahme erhalten.

Im Falle von PostgreSQL ist dies hier dokumentiert .

Bei JDBC wird eine Datenbank durch eine URL (Uniform Resource Locator) dargestellt. Mit PostgreSQL ™ hat dies eine der folgenden Formen:

  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database

Im Falle von MySQL ist dies hier dokumentiert .

Das allgemeine Format für eine JDBC-URL für die Verbindung mit einem MySQL-Server lautet wie folgt: Elemente in eckigen Klammern ( [ ]) sind optional:

jdbc:mysql://[host1][:port1][,[host2][:port2]]...[/[database]] » [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]

Im Falle von Oracle ist dies hier dokumentiert .

Es gibt 2 URL-Syntax, alte Syntax, die nur mit SID funktioniert, und neue mit Oracle-Dienstnamen.

Alte Syntax jdbc:oracle:thin:@[HOST][:PORT]:SID

Neue Syntax jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


Siehe auch:

BalusC
quelle
Danke Leute! Entschuldigung, der erste Versuch war nicht in OP, nur jdbc: postgresql: mmas (und ich hatte andere ausprobiert!). Leider mit der URL von araqnid das gleiche Ergebnis. Letzte Nacht habe ich Tablib-Inhalte gegen (ick) Embedded Java ausgetauscht, und das funktioniert einwandfrei: try {Class.forName ("org.postgresql.Driver"). NewInstance (); con = DriverManager.getConnection ("jdbc: postgresql: mmas", "mmas", "passwd"); stmt = con.createStatement (); rs = stmt.executeQuery ("select yada yada"); if (rs! = null && rs.next ()) {// ernte Ruhm, Reichtum, Ruhm, Babes Jakarta Beispiel war w / taglibs, also habe ich so angefangen.
Rick Wayne
Ah. Kommentare nicht so sehr mit der Code-Formatierung. Hm. Zeigt sich mein Neuling? (ZIIP!) Wie auch immer, im Jakarta-Beispiel ging es darum, die <sql: query> -Syntax zu verwenden, anstatt nur Java-Code einzubetten, und ich stimme zu, dass dies eine viel sauberere Methode ist. Man sollte nicht explizit forName () und getConnection () aufrufen müssen, oder? Aber die alte hässliche Hack-the-Driver-Code-in-the-Presentation-Layer-Methode hat beim ersten Versuch einwandfrei funktioniert. Ich bin verblüfft, aber jetzt geht es eher um Wartung / Ästhetik als um "Dies ist kaputt, beheben Sie es oder verbessern Sie Ihre Fähigkeiten als Burger-Flipper."
Rick Wayne
IMHO ist die Verwendung der SQL-Taglib nur geringfügig besser als JDBC in Scriptlets. Ich bevorzuge ein Controller- / Ansichtsmuster, bei dem das DB-Zeug im Voraus erledigt wird und die JSP nur Zeug anzeigt. Jeder für sich und die Verwendung von sql: query hält die Dinge einfach :) (ish)
araqnid
Ich habe nie gesagt, dass ich mit der Verwendung von JSTL SQL Taglib einverstanden bin, aber das ist nicht das Thema, um das es in diesem Thema geht.
BalusC
2
Vielen Dank, Ihre JDBC-Verbindungszeichenfolgenformate waren äußerst hilfreich!
Jay Taylor
15
url="jdbc:postgresql//localhost:5432/mmas"

Diese URL sieht falsch aus. Benötigen Sie Folgendes?

url="jdbc:postgresql://localhost:5432/mmas"
araqnid
quelle
15

Ich habe vergessen, den PostgreSQL JDBC-Treiber in mein Projekt ( Mvnrepository) aufzunehmen ) aufzunehmen.

Gradle :

// http://mvnrepository.com/artifact/postgresql/postgresql
compile group: 'postgresql', name: 'postgresql', version: '9.0-801.jdbc4'

Maven :

<dependency>
    <groupId>postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>9.0-801.jdbc4</version>
</dependency>

Sie können die JAR auch herunterladen und manuell in Ihr Projekt importieren.

Manuel Schmitzberger
quelle
12

Ich stand vor dem ähnlichen Problem. Mein Projekt im Kontext ist Dynamic Web Project (Java 8 + Tomcat 8) und der Fehler ist für die PostgreSQL-Treiberausnahme: Kein geeigneter Treiber gefunden

Es wurde durch Hinzufügen Class.forName("org.postgresql.Driver")vor dem Aufrufen der getConnection()Methode behoben

Hier ist mein Beispielcode:

try {
            Connection conn = null;
            Class.forName("org.postgresql.Driver");
            conn = DriverManager.getConnection("jdbc:postgresql://" + host + ":" + port + "/?preferQueryMode="
                    + sql_auth,sql_user , sql_password);
        } catch (Exception e) {
            System.out.println("Failed to create JDBC db connection " + e.toString() + e.getMessage());
        }
Vinayak Singh
quelle
3

Ich fand den folgenden Tipp hilfreich, um dieses Problem in Tomcat zu beheben -

Stellen Sie sicher, dass Sie den Treiber zuerst laden, indem Sie Class.forName ("org.postgresql.Driver") ausführen. in Ihrem Code.

Dies ist aus dem Beitrag - https://www.postgresql.org/message-id/[email protected]

Der JDBC-Code funktionierte gut als eigenständiges Programm, gab jedoch in TOMCAT den Fehler "Kein geeigneter Treiber gefunden" aus.

Ein Venkatraman
quelle
Bitte kein Link antwortet nur - beschreiben Sie kurz, was dahinter steckt!
Monamona
Ein Link zu einer Lösung ist willkommen, aber stellen Sie sicher, dass Ihre Antwort ohne sie nützlich ist: Fügen Sie dem Link einen Kontext hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist, und zitieren Sie dann den relevantesten Teil der Seite, die Sie verwenden. erneutes Verknüpfen mit, falls die Zielseite nicht verfügbar ist. Antworten, die kaum mehr als ein Link sind, können gelöscht werden .
Peter
1

Es kann erwähnenswert sein, dass dies auch auftreten kann, wenn Windows Downloads blockiert, die es als unsicher erachtet. Dies kann behoben werden, indem Sie mit der rechten Maustaste auf die JAR-Datei (z. B. ojdbc7.jar) klicken und das Kontrollkästchen "Entsperren" unten aktivieren.

Dialogfeld "Eigenschaften der Windows-JAR-Datei" :
Dialogfeld "Eigenschaften der Windows-JAR-Datei"

user7994072
quelle
1

Ein sehr dummer Fehler, der möglicherweise auftreten kann, ist das Hinzufügen von Speicherplatz zu Beginn der JDBC-URL-Verbindung.

Was ich meine ist:-

Angenommen, Sie haben bymistake die jdbc URL wie gegeben

String jdbcUrl=" jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(Beachten Sie, dass das Starren der URL ein Leerzeichen enthält. Dies führt zu einem Fehler.)

Der richtige Weg sollte sein:

String jdbcUrl="jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(Beachten Sie, dass das Starren kein Leerzeichen enthält. Sie können am Ende der URL Leerzeichen eingeben, dies ist jedoch sicher.)

ankkol2011
quelle
0

Ich habe jruby verwendet, in meinem Fall habe ich unter config / initializers erstellt

postgres_driver.rb

$CLASSPATH << '~/.rbenv/versions/jruby-1.7.17/lib/ruby/gems/shared/gems/jdbc-postgres-9.4.1200/lib/postgresql-9.4-1200.jdbc4.jar'

oder wo auch immer Ihr Fahrer ist, und das war's!

Ale Guro
quelle
0

Stellen Sie neben dem Hinzufügen des MySQL JDBC-Connectors sicher, dass die Datei context.xml (falls nicht im Ordner Tomcat webapps entpackt) mit Ihren DB-Verbindungsdefinitionen im Verzeichnis Tomcats conf enthalten ist.

feistyfawn
quelle
0

Ich hatte genau dieses Problem bei der Entwicklung einer Spring Boot-Anwendung in STS, aber letztendlich bei der Bereitstellung des gepackten Krieges für WebSphere (v.9). Aufgrund früherer Antworten war meine Situation einzigartig. ojdbc8.jar befand sich in meinem Ordner WEB-INF / lib, wobei das Laden der übergeordneten letzten Klasse festgelegt war, es wird jedoch immer angegeben, dass der geeignete Treiber nicht gefunden werden konnte.

Mein letztes Problem war, dass ich die falsche DataSource-Klasse verwendete, weil ich nur Online-Tutorials / Beispielen folgte. Den Hinweis dank David Dais Kommentar zu seiner eigenen Frage hier gefunden: Spring JDBC JDBC-Treiberklasse konnte nicht geladen werden [oracle.jdbc.driver.OracleDriver]

Auch später gefunden Spring Guru Beispiel mit Oracle-spezifischen Treiber: https://springframework.guru/configuring-spring-boot-for-oracle/

Beispiel, das anhand org.springframework.jdbc.datasource.DriverManagerDataSourcegenerischer Beispiele Fehler auslöst.

@Config
@EnableTransactionManagement
public class appDataConfig {
 \* Other Bean Defs *\
    @Bean
    public DataSource dataSource() {
        // configure and return the necessary JDBC DataSource
        DriverManagerDataSource dataSource = new DriverManagerDataSource("jdbc:oracle:thin:@//HOST:PORT/SID", "user", "password");
        dataSource.setSchema("MY_SCHEMA");
        return dataSource;
    }
}

Und das korrigierte Beispiel mit oracle.jdbc.pool.OracleDataSource:

@Config
@EnableTransactionManagement
public class appDataConfig {
/* Other Bean Defs */
@Bean
    public DataSource dataSource() {
        // configure and return the necessary JDBC DataSource
        OracleDataSource datasource = null;
        try {
            datasource = new OracleDataSource();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        datasource.setURL("jdbc:oracle:thin:@//HOST:PORT/SID");
        datasource.setUser("user");
        datasource.setPassword("password");

        return datasource;
    }
}
Ryan D.
quelle
0

Ich bin auf dieses Problem gestoßen, indem ich eine XML-Datei src/main/resourcesfalsch in die Datei eingefügt, sie gelöscht und dann wieder normalisiert habe.

jerryleooo
quelle
0

Ich hatte das gleiche Problem mit der MySQL-Datenquelle bei der Verwendung von Spring-Daten, die außerhalb funktionieren würden, gab mir jedoch diesen Fehler bei der Bereitstellung auf Tomcat.

Der Fehler wurde behoben, als ich den Treiber jar mysql-connector-java-8.0.16.jar zum Ordner jres lib / ext hinzufügte

Ich wollte dies jedoch nicht in der Produktion tun, weil ich befürchtete, andere Anwendungen zu stören. Die explizite Definition der Treiberklasse hat dieses Problem für mich gelöst

    spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
Jag
quelle
0

Führen Sie javamit CLASSPATHUmgebungsvariable zeigt auf Fahrer JAR - Datei, zB

CLASSPATH='.:drivers/mssql-jdbc-6.2.1.jre8.jar' java ConnectURL

Wo drivers/mssql-jdbc-6.2.1.jre8.jarist der Pfad zur Treiberdatei (z. B. JDBC für SQL Server ) ?

Das ConnectURList die Beispiel-App von diesem Treiber ( samples/connections/ConnectURL.java), kompiliert über javac ConnectURL.java.

Kenorb
quelle
0

In meinem Fall habe ich mit Maven an einem Java-Projekt gearbeitet und bin auf diesen Fehler gestoßen. Stellen Sie in Ihrer pom.xml-Datei sicher, dass Sie diese Abhängigkeiten haben

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.11</version>
    </dependency>
  </dependencies>

und wo Sie eine Verbindung herstellen, haben Sie so etwas

public Connection createConnection() {
        try {
            String url = "jdbc:mysql://localhost:3306/yourDatabaseName";
            String username = "root"; //your my sql username here
            String password = "1234"; //your mysql password here

            Class.forName("com.mysql.cj.jdbc.Driver");
            return DriverManager.getConnection(url, username, password);
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }
Gerechtigkeit Bringer
quelle