93 votes

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

Je suis en train de créer une connexion à ma base de données, lorsque j'ai mis mon code à l'aide de la méthode main, il fonctionne de manière transparente. Toutefois, lorsque vous essayez d'y accéder par le biais de Tomcat 7, il échoue avec l'erreur:

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

Je suis à l'aide de la mutualisation. Je l'ai mis dans mysql connector (5.1.15), dbcp (1.4) , et de la piscine(1.4.5) des bibliothèques dans WEB-INF/lib et dans .classpath. Je suis à l'aide de l'IDE Eclipse. 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 mon stack trace:

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

Quelle est la cause de cette erreur?

58voto

doc_180 Points 8017

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)

43voto

Eric Leschinski Points 14289

La raison pour laquelle vous eu 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 jdbc mysql 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 devez lire le manuel de votre pilote jdbc mysql pour trouver l'expression exacte de place à l'intérieur de la Classe.forName("...") paramètre.

Classe.forName pas nécessaire avec JDBC v. 4

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

37voto

ybenjira Points 119

J'ai eu le même problème avec Tomcat7 avec mysql-connector-java-5.1.26 que j'ai mis à la fois dans mes $ CATALINA_HOME / lib et WEB-INF / lib, juste 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 ());

OU

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

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

8voto

bjethwan Points 1

Si vous exécutez tomcat en mode eclipse, il ne sélectionnera pas la bibliothèque définie dans CATALINA_HOME/lib , il existe deux méthodes pour y remédier. Double-cliquez sur le serveur Tomcat dans la vue serveurs eclipse. Il ouvrira la configuration du plugin 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)"

3voto

test30 Points 359

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.

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