L'infame java.sql.SQLException: nessun driver adatto trovato


90

Sto cercando di aggiungere un JSP abilitato per database a un'applicazione Tomcat 5.5 esistente (GeoServer 2.0.0, se aiuta).

L'app stessa parla bene con Postgres, quindi so che il database è attivo, l'utente può accedervi, tutte quelle cose buone. Quello che sto cercando di fare è una query di database in un JSP che ho aggiunto. Ho usato l'esempio di configurazione nell'esempio dell'origine dati Tomcat praticamente fuori dagli schemi. I taglib richiesti sono nel posto giusto: non si verificano errori se ho solo i rif taglib, quindi è trovare quei JAR. Il driver jdbc postgres, postgresql-8.4.701.jdbc3.jar si trova in $ CATALINA_HOME / common / lib.

Ecco la parte superiore del 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>

La relativa sezione da $ CATALINA_HOME / conf / server.xml, all'interno della <Host>quale si trova a sua volta all'interno <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>

Queste righe sono le ultime nel 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>

Infine, l'eccezione:

   exception
    org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver"
    [...wads of ensuing goo elided]

Risposte:


109

L'infame java.sql.SQLException: nessun driver adatto trovato

Questa eccezione può avere fondamentalmente due cause:

1. Il driver JDBC non è caricato

È necessario assicurarsi che il driver JDBC sia posizionato nella /libcartella del server .

Oppure, quando in realtà non stai utilizzando un'origine dati del pool di connessioni gestita dal server, ma stai armeggiando manualmente con DriverManager#getConnection()WAR, devi posizionare il driver JDBC in WAR /WEB-INF/libed eseguire ..

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

.. nel codice prima della prima DriverManager#getConnection()chiamata per cui ti assicuri di non ingoiare / ignorare ciò ClassNotFoundExceptionche può essere lanciato da esso e continuare il flusso del codice come se non fosse successo nulla di eccezionale. Vedi anche Dove devo posizionare il driver JDBC per il pool di connessioni di Tomcat?

2. Oppure, l'URL JDBC ha una sintassi errata

È necessario assicurarsi che l'URL JDBC sia conforme alla documentazione del driver JDBC e tenere presente che di solito fa distinzione tra maiuscole e minuscole. Quando l'URL JDBC non viene restituito trueper Driver#acceptsURL()nessuno dei driver caricati, verrà visualizzata anche questa eccezione.

In caso di PostgreSQL è documentato qui .

Con JDBC, un database è rappresentato da un URL (Uniform Resource Locator). Con PostgreSQL ™, ciò assume una delle seguenti forme:

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

In caso di MySQL è documentato qui .

Il formato generale per un URL JDBC per la connessione a un server MySQL è il seguente, con gli elementi tra parentesi quadre ( [ ]) che sono facoltativi:

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

In caso di Oracle è documentato qui .

Esistono 2 sintassi URL, la vecchia sintassi che funzionerà solo con SID e quella nuova con il nome del servizio Oracle.

Vecchia sintassi jdbc:oracle:thin:@[HOST][:PORT]:SID

Nuova sintassi jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


Guarda anche:


Grazie ragazzi! Scusa il primo tentativo non era in OP, solo jdbc: postgresql: mmas (e ne avevo provati altri!). Purtroppo, con l'URL di araqnid, lo stesso risultato. La scorsa notte ho scambiato le cose di tablib con (ick) Java incorporato, e funziona bene: prova {Class.forName ("org.postgresql.Driver"). NewInstance (); con = DriverManager.getConnection ("jdbc: postgresql: mmas", "mmas", "passwd"); stmt = con.createStatement (); rs = stmt.executeQuery ("seleziona yada yada"); if (rs! = null && rs.next ()) {// reap fame, fortune, glory, babes L'esempio di Jakarta era con taglibs, quindi ho iniziato così.
Rick Wayne,

Ah. Commenti non tanto con la formattazione del codice. Ehm. Il mio principiante sta mostrando? (ZIIP!) Ad ogni modo, l'esempio di Jakarta riguardava l'uso della sintassi <sql: query> invece di incorporare semplicemente codice Java, e sono d'accordo che sia un modo molto più pulito per farlo. Non dovrebbe essere necessario chiamare esplicitamente forName () e getConnection (), giusto? Ma il vecchio e brutto metodo hack-the-driver-code-nel-livello di presentazione ha funzionato bene, primo tentativo. Quindi sono sconcertato, ma ora è più un problema di manutenzione / estetica che "Questo è rotto, aggiustalo o rispolvera le tue capacità di lanciare hamburger".
Rick Wayne,

IMHO che usa sql taglib è solo leggermente migliore che fare JDBC negli scriptlet ... preferisco di gran lunga un modello di controller / visualizzazione in cui le cose del db sono fatte in anticipo e il JSP mostra solo cose. Ognuno per conto suo, e l'uso di sql: query mantiene le cose semplici :) (ish)
araqnid

Non ho mai detto di essere d'accordo con l'utilizzo di JSTL SQL taglib, ma non è questo l'argomento di cui tratta questo argomento.
BalusC

2
Grazie, i formati delle stringhe di connessione JDBC sono stati estremamente utili!
Jay Taylor

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

L'URL sembra sbagliato, hai bisogno di quanto segue?

url="jdbc:postgresql://localhost:5432/mmas"

15

Ho dimenticato di aggiungere il driver JDBC PostgreSQL al mio progetto ( Mvnrepository ).

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>

Puoi anche scaricare il JAR e importarlo manualmente nel tuo progetto.


12

Ho affrontato un problema simile. Il mio progetto nel contesto è Dynamic Web Project (Java 8 + Tomcat 8) e l'errore è per l'eccezione del driver PostgreSQL: nessun driver adatto trovato

È stato risolto aggiungendo Class.forName("org.postgresql.Driver")prima di chiamaregetConnection() metodo

Ecco il mio codice di esempio:

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());
        }

3

Ho trovato utile il seguente suggerimento per eliminare questo problema in Tomcat -

assicurati di caricare prima il driver eseguendo Class.forName ("org.postgresql.Driver"); nel codice.

Questo è tratto dal post: https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

Il codice jdbc ha funzionato bene come programma autonomo ma, in TOMCAT ha dato l'errore "Nessun driver adatto trovato"


Per favore nessun link solo risposte - descrivi brevemente cosa c'è dietro!
monamona

Un collegamento a una soluzione è il benvenuto, ma assicurati che la tua risposta sia utile senza di essa: aggiungi un contesto attorno al collegamento in modo che i tuoi colleghi utenti abbiano un'idea di cosa sia e perché sia ​​lì, quindi cita la parte più pertinente della pagina che tu " re collegamento a nel caso in cui la pagina di destinazione non è disponibile. Le risposte che sono poco più di un collegamento possono essere eliminate .
Peter

1

Potrebbe valere la pena notare che ciò può verificarsi anche quando Windows blocca i download che considera non sicuri. Questo può essere risolto facendo clic con il pulsante destro del mouse sul file jar (come ojdbc7.jar) e selezionando la casella "Sblocca" in basso.

Finestra di dialogo delle proprietà del file JAR di Windows :
Finestra di dialogo delle proprietà del file JAR di Windows


1

Oltre ad aggiungere il connettore JDBC MySQL, assicurati che context.xml (se non decompresso nella cartella webapps di Tomcat) con le tue definizioni di connessione DB siano incluse nella directory conf di Tomcats.


1

Un errore molto stupido che potrebbe essere il risultato è l'aggiunta di spazio all'inizio della connessione URL JDBC.

Ciò che voglio dire è:-

supponiamo che tu abbia per errore dato l'URL jdbc come

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

(Nota che c'è uno spazio nell'avviare l'URL, questo farà l'errore)

il modo corretto dovrebbe essere:

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

(Notare che non c'è spazio nello staring, puoi dare spazio alla fine dell'URL ma è sicuro non farlo)


0

Stavo usando jruby, nel mio caso l'ho creato sotto config / initializers

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'

o dovunque sia il tuo autista, e basta!


0

Ho avuto questo problema esatto durante lo sviluppo di un'applicazione Spring Boot in STS, ma alla fine ho distribuito la guerra pacchettizzata a WebSphere (v.9). Sulla base delle risposte precedenti, la mia situazione era unica. ojdbc8.jar era nella mia cartella WEB-INF / lib con il set di caricamento della classe Parent Last, ma dice sempre che non è riuscito a trovare il driver adatto.

Il mio problema finale era che stavo usando la classe DataSource errata perché stavo solo seguendo tutorial / esempi online. Ho trovato il suggerimento grazie al commento di David Dai sulla sua stessa domanda qui: Spring JDBC Impossibile caricare la classe del driver JDBC [oracle.jdbc.driver.OracleDriver]

Successivamente ho trovato anche un esempio di guru della primavera con driver specifico Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/

Esempio che genera un errore utilizzando org.springframework.jdbc.datasource.DriverManagerDataSourcebasato su esempi generici.

@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;
    }
}

E l'esempio corretto utilizzando un 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;
    }
}

0

Stavo riscontrando lo stesso problema con l'origine dati mysql che utilizzava i dati di primavera che avrebbero funzionato all'esterno, ma mi dava questo errore quando distribuito su Tomcat.

L'errore è scomparso quando ho aggiunto il driver jar mysql-connector-java-8.0.16.jar alla cartella jres lib / ext

Tuttavia non volevo farlo in produzione per paura di interferire con altre applicazioni. La definizione esplicita della classe del driver ha risolto questo problema per me

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

0

Esegui javacon CLASSPATHla variabile ambientale che punta al file JAR del driver, ad es

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

Dove si drivers/mssql-jdbc-6.2.1.jre8.jartrova il percorso del file del driver (ad es. JDBC per SQL Server ).

Il ConnectURLè l'applicazione di esempio da quel driver ( samples/connections/ConnectURL.java), compilato via javac ConnectURL.java.


0

Nel mio caso stavo lavorando a un progetto Java con Maven e ho riscontrato questo errore. Nel tuo file pom.xml assicurati di avere queste dipendenze

<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>

e dove crei la connessione hai qualcosa del genere

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;
    }

Non dovresti aver bisogno di chiamare Class.forName. DriverManagerdovrebbe essere in grado di trovarlo.
Stephen C

Potresti avere ragione. Java non è il mio linguaggio di programmazione principale.
Justice Bringer

0

Otterrai lo stesso errore se non è stata fornita una definizione di risorsa da qualche parte per la tua app, molto probabilmente nel context.xml centrale o nel file di contesto individuale in conf / Catalina / localhost. E se si utilizzano file di contesto individuali, fare attenzione che Tomcat li elimina liberamente ogni volta che si rimuove / annulla la distribuzione del file .war corrispondente.


0

Non importa quanti anni abbia questo thread, le persone continuerebbero ad affrontare questo problema.

Il mio caso: ho l'ultima (al momento della pubblicazione) OpenJDK e l'installazione di Maven. Avevo provato tutti i metodi sopra indicati, senza / fuori maven e persino soluzioni su post gemelli su StackOverflow. Non sto usando alcun IDE o altro, in esecuzione dalla semplice CLI per dimostrare solo la logica di base.

Ecco cosa ha finalmente funzionato.

  • Scarica il driver dal sito ufficiale. (per me era MySQL https://www.mysql.com/products/connector/ ). Usa il tuo sapore qui.
  • Decomprimere il file jar specificato nella stessa directory del progetto java. Otterrai una struttura di directory come questa. Se guardi attentamente, questo si riferisce esattamente a ciò che proviamo a fare usando Class.forName(....). Il file che vogliamo è ilcom/mysql/jdbc/Driver.class

https://i.imgur.com/VgpwatQ.png

  • Compila il programma java contenente il codice.
javac App.java
  • Ora carica il director come modulo eseguendo
java --module-path com/mysql/jdbc -cp ./ App

Questo caricherà manualmente il pacchetto (estratto) e il tuo programma java troverà la classe Driver richiesta.


  • Nota che questo è stato fatto per mysql driver, altri driver potrebbero richiedere modifiche minori.
  • Se il tuo fornitore fornisce .debun'immagine, puoi ottenere il vaso da/usr/share/java/your-vendor-file-here.jar

-1

Ho riscontrato questo problema inserendo un file XML in modo src/main/resourceserrato, l'ho cancellato e poi tutto torna alla normalità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.