web-dev-qa-db-fra.com

La fameuse Java.sql.SQLException: aucun pilote approprié trouvé

J'essaie d'ajouter un fichier JSP activé pour la base de données à une application Tomcat 5.5 existante (GeoServer 2.0.0, si cela peut vous aider).

L’application elle-même communique très bien avec Postgres. Je sais donc que la base de données est opérationnelle, que l’utilisateur peut y accéder, et toutes ces bonnes choses. Ce que j'essaie de faire est une requête de base de données dans un JSP que j'ai ajouté. J'ai utilisé l'exemple de configuration dans exemple de source de données Tomcat prêt à l'emploi. Les taglibs nécessaires sont au bon endroit - aucune erreur ne se produit si je ne possède que les références de taglib. Il faut donc trouver ces fichiers JAR. Le pilote jgb postgres, postgresql-8.4.701.jdbc3.jar est dans $ CATALINA_HOME/common/lib.

Voici le sommet du 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 est à 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]
68
Rick Wayne

L'infâme Java.sql.SQLException: Aucun pilote approprié trouvé

Cette exception peut avoir fondamentalement deux causes:

1. Le pilote JDBC n'est pas chargé

Vous devez vous assurer que le pilote JDBC est placé dans le dossier /lib Du serveur.

Ou bien, lorsque vous n'utilisez pas une source de données de pool de connexions gérées par le serveur, mais que vous manipulez manuellement DriverManager#getConnection() dans WAR, vous devez placer le pilote JDBC dans le /WEB-INF/lib De WAR. et performer ..

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

.. dans votre code avant le premier appel DriverManager#getConnection() par lequel vous vous assurez que vous ne pas avale/ignore tout ClassNotFoundException qui peut être projeté par elle et continue le flux de code comme si rien d’exceptionnel ne s’était passé. Voir aussi Où dois-je placer le pilote JDBC pour le pool de connexions de Tomcat?

2. Ou, l'URL JDBC est dans la syntaxe incorrecte

Vous devez vous assurer que l'URL JDBC est conforme à la documentation du pilote JDBC et garder à l'esprit que c'est généralement sensible à la casse. Lorsque l'URL JDBC ne renvoie pas true pour Driver#acceptsURL() pour 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 la connexion à 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 de Oracle , il est documenté ici .

Il existe 2 syntaxes d'URL, l'ancienne syntaxe qui ne fonctionnera qu'avec 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:

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

Cette URL semble fausse, avez-vous besoin de ce qui suit?

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

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

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

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

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

5

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

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

Ceci est tiré du message - 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é"

3
A Venkatraman

Il peut être intéressant de noter que cela peut également se produire lorsque Windows bloque les téléchargements qu’elle considère dangereux. Pour résoudre ce problème, cliquez avec le bouton droit de la souris sur le fichier jar (tel que ojdbc7.jar), puis cochez la case "Débloquer" en bas.

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

1
user7994072

Une erreur très stupide 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 bymistake étant donné l'URL de jdbc comme

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

(Notez qu'il y a un espace dans la lecture de l'URL, cela fera l'erreur)

la manière correcte devrait être:

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

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

0
ankkol2011

J'avais le même problème avec la source de données mysql qui utilisait des données de printemps qui fonctionneraient à l'extérieur, mais m'a signalé 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, de 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
0
Jag

J'utilisais jruby, dans mon cas, j'ai créé sous config/initializer

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!

0
Ale Guro

J'ai eu ce problème exact lors du développement d'une application Spring Boot dans STS, mais j'ai finalement déployé le fichier war empaqueté sur WebSphere (v.9). Sur la base des réponses précédentes, ma situation était unique. ojdbc8.jar était dans mon dossier WEB-INF/lib avec le chargement de la dernière classe Parent, mais il est toujours indiqué 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 suivais simplement des tutoriels/exemples en ligne. J'ai trouvé l'indice grâce à David Dai qui a commenté sa propre question ici: Spring JDBC n'a pas pu charger la classe de pilote JDBC [Oracle.jdbc.driver.OracleDriver]

Nous avons également trouvé plus tard un exemple Spring Guru 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.DriverManagerDataSource basé sur des 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'exemple 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;
    }
}
0
Ryan D

Exécutez Java avec la variable d’environnement CLASSPATH 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.jar est le chemin du fichier de pilote (par exemple, JDBC pour SQL Server ).

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

0
kenorb

En plus d'ajouter le connecteur JDBC MySQL, assurez-vous que le fichier context.xml (s'il n'est pas décompressé dans le dossier des applications Web Tomcat) avec vos définitions de connexion à la base de données est inclus dans le répertoire conf de Tomcats.

0
feistyfawn

J'ai rencontré ce problème en mettant un fichier XML dans le src/main/resources à tort, je l’ai effacé puis tout est revenu à la normale.

0
Jerry