La tristement célèbre exception java.sql.SQLException: aucun pilote approprié trouvé

89

J'essaie d'ajouter un JSP compatible avec la base de données à une application Tomcat 5.5 existante (GeoServer 2.0.0, si cela aide).

L'application elle-même parle très bien à Postgres, donc je sais que la base de données est active, que l'utilisateur peut y accéder, toutes ces bonnes choses. Ce que j'essaye de faire est une requête de base de données dans une JSP que j'ai ajoutée. J'ai utilisé l'exemple de configuration dans l' exemple de source de données Tomcat peu près . Les taglibs requis sont au bon endroit - aucune erreur ne se produit si je n'ai que les références taglib, donc il trouve ces JAR. Le pilote jdbc de postgres, postgresql-8.4.701.jdbc3.jar se trouve dans $ CATALINA_HOME / common / lib.

Voici le haut de la 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 section pertinente de $ CATALINA_HOME / conf / server.xml, à l'intérieur du <Host>qui se trouve à son tour dans <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>

Ces lignes sont les dernières de la balise dans 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>

Enfin, l'exception:

   exception
    org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver"
    [...wads of ensuing goo elided]
Rick Wayne
la source
Voir ma réponse: stackoverflow.com/a/38656446/632951
Pacerier

Réponses:

106

La tristement célèbre exception java.sql.SQLException: aucun pilote approprié trouvé

Cette exception peut avoir essentiellement deux causes:

1. Le pilote JDBC n'est pas chargé

Vous devez vous assurer que le pilote JDBC est placé dans le propre /libdossier du serveur .

Ou, lorsque vous n'utilisez en fait pas une source de données de pool de connexions gérée par le serveur, mais que vous tripotez manuellement DriverManager#getConnection()dans WAR, vous devez placer le pilote JDBC dans WAR /WEB-INF/libet effectuer.

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

.. dans votre code avant le premier DriverManager#getConnection()appel par lequel vous vous assurez de ne pas avaler / ignorer tout ClassNotFoundExceptionce qui peut être jeté par lui et continuer le flux de code comme si rien d'exceptionnel ne s'était produit. Voir aussi Où dois-je placer le pilote JDBC pour le pool de connexions de Tomcat?

2. Ou, l'URL JDBC est dans une mauvaise syntaxe

Vous devez vous assurer que l'URL JDBC est conforme à la documentation du pilote JDBC et garder à l'esprit qu'elle est généralement sensible à la casse. Lorsque l'URL JDBC ne revient pas truepourDriver#acceptsURL() aucun des pilotes chargés, vous obtiendrez également exactement cette exception.

Dans le cas de PostgreSQL, il est documenté ici .

Avec JDBC, une base de données est représentée par une URL (Uniform Resource Locator). Avec PostgreSQL ™, cela prend l'une des formes suivantes:

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

Dans le cas de MySQL, il est documenté ici .

Le format général d'une URL JDBC pour se connecter à un serveur MySQL est le suivant, les éléments entre crochets ( [ ]) étant facultatifs:

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

Dans le cas d' Oracle, il est documenté ici .

Il existe 2 syntaxes URL, l'ancienne syntaxe qui ne fonctionnera qu'avec le SID et la nouvelle avec le nom de service Oracle.

Ancienne syntaxe jdbc:oracle:thin:@[HOST][:PORT]:SID

Nouvelle syntaxe jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


Voir également:

BalusC
la source
Merci les gars! Désolé, la première tentative n'était pas dans OP, juste jdbc: postgresql: mmas (et j'en ai essayé d'autres!). Malheureusement, avec l'URL d'araqnid, même résultat. Hier soir, j'ai échangé des trucs de tablib pour (ick) Java intégré, et cela fonctionne très bien: essayez {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 ()) {// récolter la renommée, la fortune, la gloire, les filles L'exemple de Jakarta était w / taglibs, donc j'ai commencé de cette façon.
Rick Wayne
Ah. Commentaires pas tellement avec le formatage du code. Ahem. Mon débutant est-il présenté? (ZIIP!) Quoi qu'il en soit, l'exemple de Jakarta consistait à utiliser la syntaxe <sql: query> au lieu de simplement incorporer du code Java, et je suis d'accord que c'est une façon beaucoup plus propre de le faire. On ne devrait pas avoir besoin d'appeler explicitement forName () et getConnection (), non? Mais la vieille méthode moche de hack-the-driver-code-in-the-presentation-layer fonctionnait très bien, essayez d'abord. Je suis donc déconcerté, mais maintenant c'est plus un problème d'entretien / esthétique que "C'est cassé, corrigez-le ou rafraîchissez vos compétences en matière de burger-flipping."
Rick Wayne
À mon humble avis, l'utilisation du taglib sql n'est que légèrement meilleure que de faire JDBC dans des scriptlets ... préfère de loin un modèle de contrôleur / vue où les trucs de la base de données sont faits d'avance et le JSP affiche juste des trucs. Chacun à son propre cependant, et l'utilisation de sql: query simplifie les choses :)
araqnid
Je n'ai jamais dit que j'étais d'accord avec l'utilisation de JSTL SQL taglib, mais ce n'est pas le sujet de ce sujet.
BalusC
2
Merci, vos formats de chaîne de connexion JDBC ont été extrêmement utiles!
Jay Taylor
15
url="jdbc:postgresql//localhost:5432/mmas"

Cette URL semble incorrecte, avez-vous besoin des éléments suivants?

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

J'ai oublié d'ajouter le pilote JDBC PostgreSQL dans mon projet ( 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>

Vous pouvez également télécharger le JAR et l'importer manuellement dans votre projet.

Manuel Schmitzberger
la source
12

J'ai fait face au même problème. Mon projet en contexte est Dynamic Web Project (Java 8 + Tomcat 8) et l'erreur concerne l'exception du pilote PostgreSQL: aucun pilote approprié trouvé

Il a été résolu en ajoutant Class.forName("org.postgresql.Driver")avant d'appelergetConnection() méthode

Voici mon exemple de code:

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
la source
3

J'ai trouvé le conseil suivant utile, pour éliminer ce problème dans Tomcat -

assurez-vous de charger d'abord le pilote en effectuant un Class.forName ("org.postgresql.Driver"); dans votre code.

Ceci est du post - https://www.postgresql.org/message-id/[email protected]

Le code jdbc fonctionnait bien en tant que programme autonome mais, dans TOMCAT, il donnait l'erreur -'Aucun pilote approprié trouvé '

Un Venkatraman
la source
S'il vous plaît pas de lien seulement des réponses - décrivez brièvement ce qui se cache derrière cela!
monamona le
Un lien vers une solution est le bienvenu, mais veuillez vous assurer que votre réponse est utile sans elle: ajoutez du contexte autour du lien afin que vos collègues utilisateurs aient une idée de ce que c'est et pourquoi il est là, puis citez la partie la plus pertinente de la page que vous '' relier au cas où la page cible ne serait pas disponible. Les réponses qui ne sont guère plus qu'un lien peuvent être supprimées .
Peter
1

Il peut être intéressant de noter que cela peut également se produire lorsque Windows bloque les téléchargements qu'il considère comme dangereux. Cela peut être résolu en cliquant avec le bouton droit sur le fichier jar (tel que ojdbc7.jar) et en cochant la case «Débloquer» en bas.

Boîte de dialogue Propriétés du fichier JAR Windows :
Boîte de dialogue Propriétés du fichier JAR Windows

user7994072
la source
1

Outre l'ajout du connecteur JDBC MySQL, assurez-vous que le fichier context.xml (s'il n'est pas décompressé dans le dossier Tomcat webapps) avec vos définitions de connexion à la base de données est inclus dans le répertoire conf de Tomcats.

feistyfawn
la source
1

Une erreur très idiote qui pourrait être possible est l'ajout d'espace au début de la connexion URL JDBC.

Ce que je veux dire est:-

supposons que vous ayez par erreur donné l'URL jdbc comme

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

(Notez qu'il y a un espace dans le regard de l'url, cela fera l'erreur)

la bonne manière devrait être:

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

(Notez qu'il n'y a pas d'espace dans le regard, vous pouvez laisser de l'espace à la fin de l'url mais il est prudent de ne pas le faire)

ankkol2011
la source
0

J'utilisais jruby, dans mon cas j'ai créé sous 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'

ou où que se trouve votre chauffeur, et c'est tout!

Ale Guro
la source
0

J'ai eu ce problème exact lors du développement d'une application Spring Boot dans STS, mais en fin de compte, lors du déploiement de la guerre packagée sur WebSphere (v.9). D'après les réponses précédentes, ma situation était unique. ojdbc8.jar était dans mon dossier WEB-INF / lib avec le chargement de la classe Parent Last, mais il dit toujours qu'il n'a pas réussi à trouver le pilote approprié.

Mon problème ultime était que j'utilisais la classe DataSource incorrecte parce que je ne faisais que suivre des tutoriels / exemples en ligne. J'ai trouvé l'indice grâce au commentaire de David Dai sur sa propre question ici: Spring JDBC Impossible de charger la classe de pilote JDBC [oracle.jdbc.driver.OracleDriver]

Nous avons également trouvé plus tard un exemple de gourou de printemps avec un pilote spécifique à Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/

Exemple qui génère une erreur en utilisant org.springframework.jdbc.datasource.DriverManagerDataSourcedes exemples génériques.

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

Et l'exapmle corrigé en utilisant 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;
    }
}
Ryan D
la source
0

J'avais le même problème avec la source de données mysql en utilisant des données de printemps qui fonctionneraient à l'extérieur, mais m'a donné cette erreur lors du déploiement sur tomcat.

L'erreur a disparu lorsque j'ai ajouté le pilote jar mysql-connector-java-8.0.16.jar au dossier jres lib / ext

Cependant, je ne voulais pas faire cela en production par peur d'interférer avec d'autres applications. La définition explicite de la classe de pilote a résolu ce problème pour moi

    spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
Pointe
la source
0

Exécuter javaavec CLASSPATHune variable d'environnement pointant vers le fichier JAR du pilote, par exemple

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

drivers/mssql-jdbc-6.2.1.jre8.jarest le chemin d'accès au fichier du pilote (par exemple, JDBC pour pour SQL Server ).

Le ConnectURLest l'exemple d'application de ce pilote ( samples/connections/ConnectURL.java), compilé via javac ConnectURL.java.

Kenorb
la source
0

Dans mon cas, je travaillais sur un projet Java avec Maven et j'ai rencontré cette erreur. Dans votre fichier pom.xml, assurez-vous que vous avez ces dépendances

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

et où vous créez une connexion ont quelque chose comme ça

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;
    }
Justice Bringer
la source
Vous ne devriez pas avoir besoin d'appeler Class.forName. DriverManagerdevrait pouvoir le trouver.
Stephen C
Vous pouvez avoir raison. Java n'est pas mon principal langage de codage.
Justice Bringer
0

Vous obtiendrez cette même erreur s'il n'y a pas de définition de ressource fournie quelque part pour votre application - très probablement dans le fichier context.xml central ou dans un fichier de contexte individuel dans conf / Catalina / localhost. Et si vous utilisez des fichiers de contexte individuels, sachez que Tomcat les supprime librement à chaque fois que vous supprimez / annulez le déploiement du fichier .war correspondant.

em_bo
la source
0

Peu importe l'âge de ce fil, les gens continueraient à être confrontés à ce problème.

Mon cas: J'ai la dernière configuration (au moment de la publication) d'OpenJDK et de maven. J'avais essayé toutes les méthodes données ci-dessus, avec / out maven et même des solutions sur des articles sœurs sur StackOverflow. Je n'utilise aucun IDE ou quoi que ce soit d'autre, fonctionnant à partir de la CLI nue pour démontrer uniquement la logique de base.

Voici ce qui a finalement fonctionné.

  • Téléchargez le pilote depuis le site officiel. (pour moi, c'était MySQL https://www.mysql.com/products/connector/ ). Utilisez votre saveur ici.
  • Décompressez le fichier jar donné dans le même répertoire que votre projet java. Vous obtiendrez une structure de répertoires comme celle-ci. Si vous regardez attentivement, cela se rapporte exactement à ce que nous essayons de faire en utilisant Class.forName(....). Le fichier que nous voulons est lecom/mysql/jdbc/Driver.class

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

  • Compilez le programme java contenant le code.
javac App.java
  • Maintenant, chargez le directeur en tant que module en exécutant
java --module-path com/mysql/jdbc -cp ./ App

Cela chargerait le package (extrait) manuellement et votre programme java trouverait la classe Driver requise.


  • Notez que cela a été fait pour le mysqlpilote, d'autres pilotes peuvent nécessiter des modifications mineures.
  • Si votre fournisseur fournit une .debimage, vous pouvez obtenir le pot à partir de/usr/share/java/your-vendor-file-here.jar
Yash Kumar Verma
la source
-1

J'ai rencontré ce problème en insérant un fichier XML à src/main/resourcestort, je l'ai supprimé, puis je suis revenu à la normale.

jerryleooo
la source