web-dev-qa-db-fra.com

Comment résoudre le problème: Erreur "Aucun pilote approprié trouvé pour jdbc: mysql: // localhost/nom_bd" lors de l'utilisation de pools?

J'essaie de créer une connexion à ma base de données. Lorsque je teste mon code à l'aide de la méthode principale, cela fonctionne de manière transparente. Cependant, lorsque vous essayez d'y accéder via Tomcat 7, il échoue avec l'erreur: 

No suitable driver found for jdbc:mysql://localhost/dbname. 

J'utilise la mise en commun. J'ai mis dans les bibliothèques mysql connector (5.1.15), dbcp (1.4) et pool (1.4.5) dans WEB-INF/lib et dans .classpath également. J'utilise Eclipse IDE. Mon code pour le pilote de base de données est:

import Java.sql.Connection;
import Java.sql.DriverManager;
import Java.sql.SQLException;

import org.Apache.Tomcat.dbcp.dbcp.ConnectionFactory;
import org.Apache.Tomcat.dbcp.dbcp.DriverManagerConnectionFactory;
import org.Apache.Tomcat.dbcp.dbcp.PoolableConnectionFactory;
import org.Apache.Tomcat.dbcp.dbcp.PoolingDriver;
import org.Apache.Tomcat.dbcp.pool.impl.GenericObjectPool;

public class DatabaseConnector {
    public static String DB_URI = "jdbc:mysql://localhost/dbname";
    public static String DB_USER = "test";
    public static String DB_PASS = "password";

    // Singleton instance
    protected static DatabaseConnector _instance;

    protected String _uri;
    protected String _username;
    protected String _password;

    /**
     * Singleton, so no public constructor
     */
    protected DatabaseConnector(String uri, String username, String password) {
        _uri = uri;
        _username = username;
        _password = password;

        GenericObjectPool connectionPool = new GenericObjectPool(null);
        ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(
            _uri, _username, _password);
        PoolableConnectionFactory poolableConnectionFactory =
            new PoolableConnectionFactory(connectionFactory, connectionPool,
                                            null, null, false, true);
        PoolingDriver driver = new PoolingDriver();
        driver.registerPool("test", connectionPool);
    }

    /**
     * Returns the singleton instance
     */
    public static DatabaseConnector getInstance() {
        if (_instance == null) {
            _instance = new DatabaseConnector(DB_URI, DB_USER, DB_PASS);
        }
        return _instance;
    }

    /**
     * Returns a connection to the database
     */
    public Connection getConnection() {
        Connection con = null;
        try {
            con = DriverManager.getConnection("jdbc:Apache:commons:dbcp:test");
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
        return con;
    }
}

Début de ma trace de pile:

Apr 5, 2011 9:49:14 PM org.Apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [Login] in context with path [/Project] 
threw exception
Java.lang.RuntimeException: Java.sql.SQLException: 
No suitable driver found for jdbc:mysql://localhost/dbname

Qu'est ce qui cause cette erreur?

86
Tamer

Essayez de placer le fichier jar du pilote dans le dossier lib du serveur. ($ CATALINA_HOME/lib) 

Je pense que le pool de connexions doit être configuré avant même que l'application ne soit instanciée. (Du moins c'est comme ça que ça marche chez Jboss)

52

La raison pour laquelle vous avez cette erreur:

Java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost/dbname

C’est parce que vous avez oublié d’enregistrer votre pilote mysql jdbc avec l’application Java.

C'est ce que vous avez écrit:

Connection con = null;
try {
    con = DriverManager.getConnection("jdbc:Apache:commons:dbcp:test");
} catch (SQLException e) {
    throw new RuntimeException(e);
}

Devrait être ceci:

Connection con = null;
try {
    //registering the jdbc driver here, your string to use 
    //here depends on what driver you are using.
    Class.forName("something.jdbc.driver.YourFubarDriver");   
    con = DriverManager.getConnection("jdbc:Apache:commons:dbcp:test");
} catch (SQLException e) {
    throw new RuntimeException(e);
}

Vous devrez lire le manuel de votre pilote mysql jdbc spécifique pour trouver la chaîne exacte à placer dans le paramètre Class.forName ("...").

Class.forName non requis avec JDBC v.4

À partir de Java 6, Class.forName("something.jdbc.driver.YourFubarDriver") n'est plus nécessaire si vous utilisez un pilote récent (JDBC v.4). Pour plus de détails, lisez ceci: http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-en-Java-se-6.html

42
Eric Leschinski

J'ai rencontré le même problème avec Tomcat7 avec mysql-connector-Java-5.1.26 que dans mon $ CATALINA_HOME/lib et WEB-INF/lib, au cas où. Mais il ne le trouverait pas avant d’utiliser l’une ou l’autre de ces déclarations avant d’obtenir la connexion:

DriverManager.registerDriver(new com.mysql.jdbc.Driver ());

OR

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

Ensuite, j'ai supprimé mysql-connector-Java-5.1.26 de $ CATALINA_HOME/lib et la connexion fonctionne toujours.

37
ybenjira

Lorsque vous exécutez Tomcat à partir d'Eclipse, il ne choisit pas la bibliothèque définie dans CATALINA_HOME/lib, il existe deux façons de le réparer. Double-cliquez sur le serveur Tomcat dans la vue des serveurs Eclipse. Il ouvrira la configuration du plug-in Tomcat, puis:

  1. Cliquez sur "Open Launch Config"> onglet Classpath pour définir l'emplacement du connecteur mysql/j jar . Ou
  2. Emplacement du serveur> Sélectionnez l'option "Utiliser l'installation de Tomcat (prenez le contrôle de l'installation de Tomcat)"
8
bjethwan

J'ai eu la bibliothèque mysql jdbc à la fois dans $ CATALINA_HOME/lib et WEB-INF/lib, j'ai quand même eu cette erreur. J'avais besoin de Class.forName ("com.mysql.jdbc.Driver"); pour le faire fonctionner.

4
nondescript

J'ai eu le même problème, tout ce que vous avez à faire est de définir la variable d'environnement classpath pour Tomcat, vous pouvez le faire en ajoutant un fichier, dans mon cas C:\Apache-Tomcat-7.0.30\bin\setenv.bat, contenant:

set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\lib\mysql-connector-Java-5.1.14-bin.jar"

puis code, dans mon cas: 

Class.forName("com.mysql.jdbc.Driver").newInstance(); 
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/database_name", "root", "");

fonctionne bien. 

3
test30

Bro, vous pouvez également écrire le code ci-dessous:

import Java.sql.*;
import Java.io.*;
public class InsertDatabase {

public static void main(String[] args) {
    // TODO Auto-generated method stub
    try
    {  
        Class.forName("com.mysql.jdbc.Driver");  
        Connection con=DriverManager.getConnection(  
        "jdbc:mysql://localhost:3306/Maulik","root","root");  

        Statement stmt=con.createStatement();  
        ResultSet rs=stmt.executeQuery("select * from Employee");  
        while(rs.next())  
        System.out.println(rs.getInt(1)+"  "+rs.getString(2)+"  "+rs.getString(3));  
        con.close();
    }

    catch(Exception e)
    {
        System.out.println(e);
    }

        }  

}
3
Maulik

ajoutez l'artefact de maven.

 <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-Java</artifactId>
    <version>5.1.6</version>
 </dependency>
2
Tunde Pizzle

J'utilise Tomcat 7 sous Eclipse avec Java 7 et utilise le pilote jdbc pour MSSQL sqljdbc4.jar.

Lors de l'exécution du code en dehors de Tomcat, à partir d'une application Java autonome, cela fonctionnait parfaitement:

        connection = DriverManager.getConnection(conString, user, pw);

Cependant, lorsque j'ai essayé d'exécuter le même code dans Tomcat 7, j'ai constaté que je ne pouvais le faire fonctionner qu'en enregistrant d'abord le pilote, en remplaçant ce qui précède par ceci:

        DriverManager.registerDriver(new com.Microsoft.sqlserver.jdbc.SQLServerDriver());
        connection = DriverManager.getConnection(conString, user, pw);
2
nick

Utilisation: 

try {

    Class.forName("com.mysql.jdbc.Driver").newInstance();
    System.out.println("Registro exitoso");

} catch (Exception e) {

    System.out.println(e.toString());

}

DriverManager.getConnection(..
2
Joan Payano Camacho

J'ai également eu le même problème un certain temps auparavant, mais j'ai résolu ce problème.

Il peut y avoir différentes raisons à cette exception… .. Et l'une d'entre elles est peut-être que le fichier jar que vous ajoutez à votre dossier lib est peut-être ancien.

Essayez de trouver la dernière version de mysql-connector-jar et ajoutez-la à votre chemin de classe .Cela pourrait résoudre votre problème. Le mien était résolu comme ça.

1
Ankit Pawar

D'après ce que j'ai observé, il se peut que cette exception se produise pour deux raisons: (1) Le nom de votre pilote n'est pas orthographié correctement (2) Le pilote n'a pas été associé correctement au projet Java Étapes à suivre dans Eclipse: (1) Créez un nouveau projet Java . (2) copier le fichier Jar du connecteur (3) Cliquez avec le bouton droit sur le projet Java et collez-le là-bas . (4) Faites un clic droit sur le projet Java -> Propriétés -> Chemin de construction Java -> Bibliothèques-> Ajouter un fichier jar -> choisissez le projet ur (sélectionnez le fichier jar dans la liste déroulante) et cliquez sur ok. 

1
Abhishek J

si vous utilisez netbeans, vous devez ajouter le pilote JDBC Mysql dans la liste des bibliothèques du projet, dans les propriétés de votre projet.

1
Sérgio Silva

La solution est simple.

Assurez-vous que le connecteur de base de données peut être atteint par votre classpath when exécutant (ne compilant pas) le programme, par exemple:

Java -classpath .;c:\path\to\mysql-connector-Java-5.1.39.jar YourMainClass 

De même, si vous utilisez une ancienne version de Java (antérieure à JDBC 4.0), vous devez préalablement utiliser DriverManager.getConnection cette ligne:

Class.forName("your.jdbc.driver.TheDriver"); // this line is not needed for modern Java
1
Pacerier

La plupart du temps, cela se produit parce que deux fichiers mysql-connector-Java-3.0.14-production-bin.jar . Un dans le dossier lib de Tomcat et un autre dans le chemin de classe du projet. 

Essayez simplement de supprimer mysql-connector-Java-3.0.14-production-bin.jar du dossier lib.

De cette façon, ça marche pour moi.

1
RKP

Puisque personne n’a donné cette réponse, je voudrais également ajouter que vous pouvez simplement ajouter le fichier du pilote jdbc (mysql-connector-Java-5.1.27-bin.jar dans mon cas) dans le dossier lib de votre serveur (Tomcat dans mon cas). Redémarrez le serveur et cela devrait fonctionner. 

0
Susie

D'un autre thread stackoverflow:

"Seconde. Assurez-vous d'avoir le pilote JDBC MySQL appelé Connector/J dans le chemin d'accès aux classes de JMeter. Sinon, téléchargez-le, décompressez-le et déposez mysql-connector-Java-x.xx.xx-bin.jar dans le répertoire/lib de JMeter Le redémarrage de JMeter sera nécessaire pour récupérer la bibliothèque "

Assurez-vous que le fichier .jar est ajouté directement au dossier lib.

0
adrian filipescu

Lorsque je développais avec Ubuntu (Xubuntu 12.04.1), je devais faire ce qui suit: 

En utilisant

Eclipse Juno (téléchargé, non installé via le centre logiciel), Tomcat 7 (téléchargé dans un répertoire utilisateur personnalisé) également ajouté en tant que serveur dans Eclipse, Projet Web dynamique avec un servlet 3.0, MySQL Server sur localhost configuré et testé avec utilisateur et mot de passe (assurez-vous de tester) Pilote de connecteur MySQL 5.1.24 jar, 

Je "HAD" et je répète "HAD", l'instruction Class.Load ("com.mysql.jdbc.Driver") ainsi que l'ajout du connecteur driver.jar afin qu'il soit dans le dossier lib du projet Web pour que cela fonctionne dans cette situation.

IMPORTANT !!: après avoir copié le fichier driver.jar dans la bibliothèque, assurez-vous d'actualiser votre projet dans Eclipse avant d'exécuter le servlet via Tomcat.

J'ai essayé d'ajouter le fichier jar du pilote de connecteur via le chemin de construction avec et sans ClassLoad, mais cela n'a pas fonctionné!

J'espère que cela aidera tous ceux qui commencent le développement avec cette situation spécifique: la communauté Java fournit beaucoup de documentation, mais il y a tellement de variables qu'il est difficile de toutes les couvrir et rend les choses très difficiles pour le nouveau.

Je pense que si quelqu'un pouvait expliquer pourquoi Class.Load est requis ici (dans cette situation), ce serait bénéfique.

Prendre plaisir

0
MtlMike
  1. Mettez mysql-connector-Java-5.0.8-bin.jar dans $ CATALINA_HOME/lib

  2. Vérifiez les fautes de frappe dans l'URL de connexion, exemple
    "jdbc: mysql: // localhost: 3306/report" ('report' est le nom de la base de données)

  3. Assurez-vous d'utiliser le nom de la machine (exemple: localhost au lieu de l'adresse ip (127.0.0.1))
0
Bruce

Ajoutez la classe de pilote à bootstrapclasspath. Le problème est dans Java.sql.DriverManager qui ne voit pas les pilotes chargés par les chargeurs de classe autres que le chargeur de démarrage classique.

0
arathim