Il famigerato java.sql.SQLException: nessun driver adatto trovato

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

L’app in sé parla bene con Postgres, quindi so che il database è attivo, l’utente può accedervi, tutto quello che serve. Quello che sto cercando di fare è una query di database in un JSP che ho aggiunto. Ho usato l’esempio di configurazione nell’esempio di datasource Tomcat praticamente fuori dalla scatola. I taglibs necessari sono nel posto giusto – non si verificano errori se ho appena i riferimenti 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:

   select current_validstart as ValidTime from runoff_forecast_valid_time  

La sezione pertinente da $ CATALINA_HOME / conf / server.xml, all’interno di che è a sua volta all’interno di :

    

Queste righe sono le ultime nel tag in webapps / gs2 / WEB-INF / web.xml:

   The database resource for the MMAS PostGIS database   jdbc/mmas   javax.sql.DataSource   Container   

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] 

Il famigerato 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 inserito nella cartella /lib del server.

Oppure, quando in realtà non si sta utilizzando un’origine dati del pool di connessione gestita dal server, ma si sta manipolando manualmente con DriverManager#getConnection() in WAR, quindi è necessario posizionare il driver JDBC in WAR /WEB-INF/lib ed eseguire ..

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

.. nel codice prima della prima chiamata a DriverManager#getConnection() , in cui si assicura che non si ingerisca / ignori alcuna ClassNotFoundException che può essere generata da esso e continui il stream del codice come se non accadesse nulla di eccezionale. Vedi anche Dove devo posizionare il driver JDBC per il pool di connessione di Tomcat?

2. Oppure, l’URL JDBC presenta una syntax errata

È necessario assicurarsi che l’URL JDBC sia conforms alla documentazione del driver JDBC e tenere presente che di solito è case sensitive. Quando l’URL JDBC non restituisce true per Driver#acceptsURL() per uno dei driver caricati, otterrete anche esattamente questa eccezione.

Nel caso di PostgreSQL è documentato qui .

Con JDBC, un database è rappresentato da un URL (Uniform Resource Locator). Con PostgreSQL ™, questo prende una delle seguenti forms:

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

Nel 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 ( [ ] ) facoltativi:

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

In caso di Oracle è documentato qui .

Ci sono 2 syntax URL, la vecchia syntax che funzionerà solo con SID e la nuova con il nome del servizio Oracle.

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

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


Guarda anche:

  • Dove devo posizionare il driver JDBC per il pool di connessione di Tomcat?
  • Come installare il driver JDBC nel progetto Web Eclipse senza affrontare java.lang.ClassNotFoundexception
  • Come devo connettermi al database JDBC / origine dati in un’applicazione basata su servlet?
  • Qual è la differenza tra “Class.forName ()” e “Class.forName (). NewInstance ()”?
  • Connetti Java a un database MySQL
 url="jdbc:postgresql//localhost:5432/mmas" 

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

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

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

assicurati di caricare il driver prima di eseguire Class.forName (“org.postgresql.Driver”); nel tuo codice.

Questo è dal post – https://www.postgresql.org/message-id/[email protected]

Il codice jdbc ha funzionato bene come un programma standalone ma, in TOMCAT ha dato l’errore -Non trovato driver adatto ‘

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

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

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

Ho dimenticato di aggiungere il driver JDBC PostgreSQL nel progetto Mvnrepository .

Gradle :

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

Maven :

  postgresql postgresql 9.0-801.jdbc4  

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

Potrebbe valere la pena notare che questo 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 “Unblock” in basso.

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

Stavo usando jruby, nel mio caso l’ho creato sotto config / inizializzatori

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!

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 sia incluso nella directory di configurazione di Tomcats.

Ho avuto questo problema esatto quando sviluppavo un’applicazione Spring Boot in STS, ma alla fine distribuivo la guerra pacchettizzata a WebSphere (v.9). In base alle risposte precedenti, la mia situazione era unica. ojdbc8.jar era nella mia cartella WEB-INF / lib con Parent Ultimo set di caricamento della class, ma dice sempre che non è riuscito a trovare il driver adatto.

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

In seguito ho anche trovato un esempio di guru primaverile con driver specifico per Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/

Esempio che genera un errore utilizzando org.springframework.jdbc.datasource.DriverManagerDataSource basato 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 il corretto exapmle usando 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; } }