124 votes

La fameuse exception java.sql.SQLException : Aucun pilote approprié n'a été trouvé

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

L'application elle-même communique parfaitement avec Postgres, je sais donc que la base de données est en place, que l'utilisateur peut y accéder, et tout le reste. Ce que j'essaie de faire, c'est une requête de base de données dans un JSP que j'ai ajouté. J'ai utilisé l'exemple de configuration dans la page Exemple de source de données Tomcat pratiquement prêt à l'emploi. Les taglibs nécessaires sont au bon endroit - aucune erreur ne se produit si je n'ai que les refs des taglibs, donc il trouve ces JARs. Le pilote jdbc 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 correspondante de $CATALINA_HOME/conf/server.xml, à l'intérieur de la section <Host> qui se trouve à son tour à l'intérieur de <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]

135voto

BalusC Points 498232

La fameuse exception java.sql.SQLException : Aucun pilote approprié n'a été trouvé

Cette exception peut avoir essentiellement les conséquences suivantes deux causes :

1. Le pilote JDBC n'est pas chargé

En cas de Tomcat vous devez vous assurer que le pilote JDBC est placé dans le répertoire du serveur /lib dossier.

Ou, lorsque vous n'utilisez pas une source de données de pool de connexion gérée par le serveur, mais que vous manipulez manuellement les éléments suivants DriverManager#getConnection() dans WAR, vous devez placer le pilote JDBC dans le fichier /WEB-INF/lib et de réaliser .

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

dans votre code avant le premier DriverManager#getConnection() appel par lequel vous vous assurez que vous faites pas avaler/ignorer toute ClassNotFoundException qui peuvent être lancés 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 connexion de Tomcat ?

D'autres serveurs ont une façon similaire de placer le fichier JAR :

  • Poisson de verre : placer le fichier JAR dans /glassfish/lib
  • Vol à l'air libre : placer le fichier JAR dans /standalone/deployments

2. Ou bien l'URL JDBC n'a pas la bonne 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 renvoie pas true pour Driver#acceptsURL() pour l'un des pilotes chargés, vous obtiendrez exactement la même exception.

En cas de PostgreSQL il est documenté aquí .

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

En cas de MySQL il est documenté aquí .

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

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

En cas de Oracle il est documenté aquí .

Il existe deux syntaxes d'URL, l'ancienne syntaxe qui ne fonctionne qu'avec le SID et la nouvelle avec le nom du service Oracle.

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

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


Voir aussi

19voto

J'ai oublié d'ajouter le pilote JDBC PostgreSQL dans mon projet ( Dépôt Mvn ).

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 les JAR et l'importer manuellement dans votre projet.

16voto

araqnid Points 33350
url="jdbc:postgresql//localhost:5432/mmas"

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

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

13voto

Vinayak Singh Points 134

J'ai rencontré le même problème. Mon projet est un projet Web dynamique (Java 8 + Tomcat 8) et l'erreur concerne l'exception du pilote PostgreSQL : Aucun pilote approprié n'a été trouvé

Le problème a été résolu en ajoutant Class.forName("org.postgresql.Driver") avant d'appeler getConnection() método

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

3voto

A Venkatraman Points 31

J'ai trouvé l'astuce suivante utile pour éliminer ce problème dans Tomcat -

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

Ceci est tiré de l'article - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

Le code jdbc fonctionnait bien en tant que programme autonome mais, dans Tomcat, il affichait l'erreur suivante : "Aucun pilote approprié n'a été trouvé".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X