L'infâme java.SQL.SQLException: aucun pilote adapté n'a été trouvé
j'essaie d'ajouter un JSP compatible avec une base de données à une application Tomcat 5.5 existante (GeoServer 2.0.0, si cela peut aider).
L'application elle-même parle à Postgres très bien, donc je sais que la base de données est en place, l'utilisateur peut accéder, 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 L'exemple de source de données Tomcat à peu près hors de la boîte. Les taglibs nécessaires sont dans le au bon endroit -- aucune erreur ne se produit si j'ai juste les références taglib, donc il trouve ces bocaux. Le pilote JDBC PostgreSQL-8.4.701.jdbc3.jar est en $ 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 dans la balise 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]
9 réponses
l'infâme java.SQL.SQLException: aucun pilote approprié trouvé
cette exception peut avoir essentiellement deux causes:
1. Le conducteur JDBC n'est pas chargé
vous devez vous assurer que le pilote JDBC est placé dans le propre dossier du serveur /lib
.
ou, lorsque vous n'utilisez pas de source de données de pool de connexion gérée par un serveur, mais que vous trafiquez manuellement avec DriverManager#getConnection()
en temps de guerre, alors vous devez placer le pilote JDBC dans /WEB-INF/lib
en temps de guerre et effectuer ..
Class.forName("com.example.jdbc.Driver");
.. dans votre code avant le premier DriverManager#getConnection()
appel par lequel vous vous assurez que vous faites pas avalez / ignorez tout ClassNotFoundException
qui peut être jeté par elle 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?
2. Or, L'URL JDBC est dans la mauvaise syntaxe
vous devez vous assurer que L'URL JDBC est conforme à la documentation du pilote JDBC et garder à l'esprit que c'est habituellement sensible à la casse. Lorsque L'URL JDBC ne renvoie pas true
pour Driver#acceptsURL()
pour l'une des les pilotes, alors vous aurez également obtenir 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, avec les éléments entre crochets (
[ ]
) étant optionnel:
jdbc:mysql://[host1][:port1][,[host2][:port2]]...[/[database]] » [?propertyName1=propertyValue1[&propertyName2=propertyValue2]...]
dans le cas de Oracle il est documenté ici .
il y a 2 syntaxe D'URL, 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 aussi:
- Où dois-je placer le JDBC pilote pour la piscine de connexion de Tomcat?
- comment installer le pilote JDBC dans Eclipse web project sans faire face à java.lang.ClassNotFoundexception
- comment me connecter à la base de données / source de données JDBC dans une application basée sur servlet?
- Quelle est la différence entre "Classe.forName () " et " Class.forName ().newInstance ()"?
- connectez Java à une base de données MySQL
url="jdbc:postgresql//localhost:5432/mmas"
cette URL semble erronée, avez-vous besoin de ce qui suit?
url="jdbc:postgresql://localhost:5432/mmas"
j'ai trouvé le conseil suivant utile, pour éliminer ce problème dans Tomcat -
assurez-vous de charger le conducteur d'abord faire une classe.forName(" org.PostgreSQL.Driver"); dans votre code.
c'est du post - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com
le code jdbc fonctionnait bien en tant que programme autonome mais, dans TOMCAT, il donnait l'erreur - ' Pas de pilote approprié found '
j'ai fait face à la même question. Mon projet dans le contexte est le projet web dynamique (Java 8 + Tomcat 8) et l'erreur est pour le pilote PostgreSQL exception: aucun pilote approprié trouvé
il a été résolu en ajoutant Class.forName("org.postgresql.Driver")
avant d'appeler getConnection()
méthode
Voici mon code D'échantillon:
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());
}
j'ai oublié d'ajouter le pilote PostgreSQL JDBC dans le projet Mvrrepository .
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 aussi télécharger le JAR et importer à votre projet manuellement.
Il pourrait être intéressant de noter que cela peut également se produire lorsque Windows bloque les téléchargements qu'il juge dangereux. Cela peut être fait en cliquant droit sur le fichier jar (comme ojdbc7.jar), et en cochant la case "débloquer" en bas.
Windows POT de Dialogue Propriétés du Fichier :
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 soit votre chauffeur, et c'est tout !
ainsi que l'ajout du connecteur JDBC MySQL assurent le contexte.xml (s'il n'est pas déballé dans le dossier Tomcat webapps) avec vos définitions de connexion DB sont inclus dans le répertoire Tomcats conf.
j'ai eu ce problème précis lors du développement d'une application de boot à ressort dans STS, mais finalement le déploiement de la guerre packaged à 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 dernier chargement de classe de Parent réglé, mais toujours il dit qu'il n'a pas trouvé le pilote approprié.
mon problème ultime était que j'utilisais la mauvaise classe DataSource parce que je suivais juste avec des tutoriels/exemples en ligne. Trouvé l'indice grâce à David dai commentaire sur sa propre question ici: printemps JDBC ne pouvait pas charger la classe de pilote JDBC [oracle.jdbc.pilote.OracleDriver]
a également trouvé plus tard un exemple de gourou de printemps avec le pilote spécifique Oracle: https://springframework.guru/configuration-spring-boot-pour-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'extrait 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;
}
}