Как исправить: не найден подходящий драйвер для ошибки jdbc: mysql: // localhost / dbname при использовании пулов?

Я пытаюсь создать соединение с моей базой данных, когда я тестирую свой код с помощью основного метода, он работает без проблем. Однако при попытке получить к нему доступ через Tomcat 7 происходит сбой с ошибкой:

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

Я использую пул. Я добавил библиотеки mysql connector (5.1.15), dbcp (1.4) и pool (1.4.5) в WEB-INF / lib и в .classpath. Я использую Eclipse IDE. Мой код для драйвера базы данных:

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

Начало трассировки стека:

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

Что вызывает эту ошибку?


person Tamer    schedule 05.04.2011    source источник
comment
Обратите внимание, что это определенно неправильный подход к использованию средств пула соединений Tomcat.   -  person BalusC    schedule 05.04.2011
comment
Еще одна вещь, на которую следует обратить внимание, - это синтаксис URL-адреса подключения. У меня было jdbc:mysql//localhost:3306 вместо jdbc:mysql://localhost:3306   -  person Kshitiz Sharma    schedule 17.12.2014


Ответы (21)


Попробуйте поместить jar-файл с драйверами в папку lib сервера. ($ CATALINA_HOME / библиотека)

Я считаю, что пул соединений необходимо настроить еще до создания приложения. (По крайней мере, так это работает в Jboss)

person uncaught_exceptions    schedule 05.04.2011
comment
Это тоже помогло мне, когда я настраивал TeamCity. Скопируйте jar из независимого от платформы zip-файла в папку, указанную в настройке TeamCity, и нажмите кнопку обновления драйверов. - person Stephen Price; 22.03.2015
comment
Моя среда работает в докере, поэтому я добавил эту инструкцию в Dockerfile: RUN cd /usr/local/tomcat/lib && wget http://central.maven.org/maven2/org/drizzle/jdbc/drizzle-jdbc/1.3/drizzle-jdbc-1.3.jar && wget http://central.maven.org/maven2/mysql/mysql-connector-java/5.1.27/mysql-connector-java-5.1.27.jar - person jmojico; 17.12.2019
comment
Мой сервер tomcat работает с использованием инструмента XAMPP, поэтому я добавил файл jar по следующему пути: C: \ xampp \ tomcat \ lib, и это рабочий файл для меня. - person Manoj Gupta; 05.06.2021

Причина, по которой вы получили эту ошибку:

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

Это потому, что вы забыли зарегистрировать драйвер mysql jdbc в приложении Java.

Вот что вы написали:

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

Должно быть так:

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

Вам нужно будет прочитать руководство по вашему конкретному драйверу mysql jdbc, чтобы найти точную строку, которую нужно поместить в параметр Class.forName ("...").

Class.forName не требуется с JDBC v.4

Начиная с Java 6, Class.forName("something.jdbc.driver.YourFubarDriver") больше не нужен, если вы используете последний драйвер (JDBC v.4). Подробности читайте здесь: http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html

person Eric Leschinski    schedule 14.09.2011
comment
До выпуска спецификации JDBC 4.0 клиентскому приложению необходимо было загрузить класс драйвера с помощью команды Class.forName (...). Я даже проверил файл META-INF / services / java.sql.Driver. В моем случае приложение работает нормально на причальном сервере (через maven или автономно), но когда я пытаюсь запустить его на других серверах (я тестировал на tomcat и glassfish), я получаю указанную выше ошибку. Я даже пытался скопировать mysql-connector-java-5.1.18.jar внутри apache-tomcat-7.0.23 / lib, так что может быть причиной того, что он не работает на этих серверах. - person Pramod; 14.12.2011
comment
Я обнаружил, что с Tomcat 7 и Java 7 снова необходимо выполнить Class.forName (something.jdbc.driver.YourFubarDriver); По крайней мере, это решило эту проблему для меня в одном развертывании. Тот же .war отлично работал на Tomcat 5.5 с Java 6, но 7/7 выдал исключение о неподходящем драйвере. - person Brad Whitaker; 04.05.2012
comment
Нет, начиная с Java 6, Class.forName (something.jdbc.driver.YourFubarDriver) больше не нужен , если вы используете последний драйвер (JDBC v.4). Вероятно, с Tomcat 7 вы использовали более старый драйвер, чем с Tomcat 5.5. См. Подробную информацию в Javadoc DriverManager. - person Pino; 13.09.2012
comment
Они вам не понадобятся. Однако это сильно зависит от версии драйвера / версии ОС / версии Tomcat / версии Java. Даже последние комбинации драйверов и JDK могут не работать. На всякий случай вам нужно использовать Class.forName - person Lorenzo Dematté; 15.04.2014
comment
Согласно tomcat.apache. Веб-приложения tomcat-8.0-doc /, у которых есть драйверы баз данных в их каталоге WEB-INF / lib, не могут полагаться на механизм поставщика услуг и должны явно регистрировать драйверы. - person Shannon; 10.01.2015
comment
Технически это не требуется для JDBC 4+ ... но проект, над которым я работаю, требует, чтобы он загружал Postgres JDBC. Он отлично работал в небольшом автономном проекте, но по какой-то причине Class.forName (...) был необходим в основном веб-проекте. Странные вещи. - person DeveloperDemetri; 19.02.2016
comment
Я сбит с толку, зачем когда-либо нужно было звонить Class.forName? Разве этот класс не должен быть в пути к классам? Почему нам нужно загружать класс вручную? Мне никогда не приходилось загружать класс вручную, что в этом особенного? - person DavidS; 10.06.2016
comment
@DavidS Загрузка класса драйвера JDBC приводит к тому, что класс регистрируется в DriverManager в соответствии со спецификацией JDBC, см. stackoverflow.com/q/32922459 и stackoverflow.com/q/5484227. - person Martin; 13.05.2018

У меня была такая же проблема с Tomcat7 с mysql-connector-java-5.1.26, которую я на всякий случай поместил в свои $ CATALINA_HOME / lib и WEB-INF / lib. Но он не нашел бы его, пока я не использовал одно из этих двух операторов перед установкой соединения:

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

OR

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

Затем я удалил mysql-connector-java-5.1.26 из $ CATALINA_HOME / lib, и соединение все еще работает.

person ybenjira    schedule 08.10.2013
comment
Вам не нужны никакие инструкции, для меня это сработало, просто переместив коннектор в WEB-INF / lib. - person Vlad Schnakovszki; 03.12.2013
comment
Вы не должны в них нуждаться. Однако это сильно зависит от версии драйвера / версии ОС / версии Tomcat / версии Java. Даже последние комбинации драйверов и JDK могут не работать. На всякий случай вам нужно использовать Class.forName - person Lorenzo Dematté; 15.04.2014
comment
не надо и реальность разные =) Драйвера надо прописывать при работе как под Tomcat 7, так и под Tomcat 8. - person Alfishe; 02.07.2014
comment
Текст скопирован из этого ответа: stackoverflow.com/a/5484287/2479087; Никогда не вызывайте метод DriverManager.registerDriver () вручную. Спецификация JDBC требует, чтобы драйвер регистрировался при загрузке класса, а класс загружается через Class.forName (). В JDBC 4 драйверы могут загружаться автоматически, просто находясь на пути к классу. - person Max; 10.07.2014
comment
Я думаю, это хорошая практика - регистрировать драйвер перед выполнением операций .. - person peaceUser; 21.12.2016
comment
Это мне помогает. Большое спасибо! - person iscariot; 08.08.2017
comment
Tomcat 8 / JDK 1.7: после принудительной отмены регистрации Class.forName () не работает, а registerDriver () работает. - person access_granted; 21.09.2018

При запуске tomcat из eclipse он не выбирает библиотеку, установленную в CATALINA_HOME/lib, есть два способа исправить это. Дважды щелкните сервер Tomcat в представлении серверов eclipse, он откроет конфигурацию плагина tomcat, а затем либо:

  1. Щелкните «Открыть конфигурацию запуска»> вкладка «Путь к классам» и установите расположение jar-файла mysql connector / j. или
  2. Расположение сервера> выберите вариант с надписью «Использовать установку Tomcat (взять под контроль установку Tomcat)».
person bjethwan    schedule 04.01.2014

У меня была библиотека mysql jdbc как в $ CATALINA_HOME / lib, так и в WEB-INF / lib, но я получил эту ошибку. Мне нужен Class.forName ("com.mysql.jdbc.Driver"); чтобы заставить его работать.

person nondescript    schedule 05.11.2014

Братан, ты также можешь написать код, как показано ниже:

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

        }  

}
person Maulik    schedule 30.01.2017

У меня была такая же проблема, все, что вам нужно сделать, это определить переменную среды classpath для tomcat, вы можете сделать это, добавив файл, в моем случае C:\apache-tomcat-7.0.30\bin\setenv.bat, содержащий:

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

затем код, в моем случае:

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

работает отлично.

person test30    schedule 19.09.2012
comment
Это мне очень помогло, но в моем случае мне пришлось перейти с DriverManager.getConnection("jdbc:mysql://localhost:3306;user=username;password=password;database=databasename") на DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename","user","password"). - person desw; 29.06.2015
comment
Это решило проблему для меня - person Jones G; 25.02.2018

Я запускаю Tomcat 7 в Eclipse с Java 7 и использую драйвер jdbc для MSSQL sqljdbc4.jar.

При запуске кода вне tomcat из автономного java-приложения это работало нормально:

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

Однако, когда я попытался запустить тот же код внутри Tomcat 7, я обнаружил, что могу заставить его работать, только сначала зарегистрировав драйвер, изменив приведенное выше на это:

        DriverManager.registerDriver(new com.microsoft.sqlserver.jdbc.SQLServerDriver());
        connection = DriverManager.getConnection(conString, user, pw);
person nick    schedule 21.10.2014

добавить артефакт из maven.

 <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.6</version>
 </dependency>
person Tunde Pizzle    schedule 01.10.2016

Использовать:

try {

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

} catch (Exception e) {

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

}

DriverManager.getConnection(..
person Joan Payano Camacho    schedule 26.12.2016
comment
Хороший ответ! Возможно, вы захотите объяснить, почему код работает :) - person Max; 27.12.2016
comment
ЭТО ПРАВИЛЬНЫЙ ОТВЕТ В МОЕМ СЛУЧАЕ - person Hatim; 11.03.2017

У меня тоже была такая же проблема некоторое время назад, но я решил эту проблему.

Причины этого исключения могут быть разными. И одна из них может заключаться в том, что банка, которую вы добавляете в папку lib, может быть старой.

Попробуйте найти последнюю версию mysql-connector-jar и добавить ее в свой путь к классам. Это может решить вашу проблему. Моя решилась так.

person Ankit Pawar    schedule 10.01.2013

если вы используете netbeans, вы должны добавить драйвер Mysql JDBC в список библиотек проекта в свойствах вашего проекта.

person Sérgio Silva    schedule 05.07.2012

В большинстве случаев это происходит из-за двух файлов mysql-connector-java-3.0.14-production-bin.jar. Один в папке lib в tomcat, а другой в пути к классам проекта.

Просто попробуйте удалить mysql-connector-java-3.0.14-production-bin.jar из папки lib.

Таким образом, у меня это работает.

person RKP    schedule 03.06.2014

Из того, что я наблюдал, может быть две причины возникновения этого исключения: (1) Ваше имя драйвера написано неправильно. (2) Драйвер не был должным образом связан с проектом Java. Действия, которые необходимо выполнить в Eclipse: (1) Создайте новый проект Java. (2) скопируйте файл Jar коннектора (3) Щелкните правой кнопкой мыши проект Java и вставьте его туда. (4) Щелкните правой кнопкой мыши проект Java -> Свойства -> Путь сборки Java -> библиотеки -> Добавить Jar -> выберите проект ur (выберите файл jar из раскрывающегося списка) и нажмите ОК.

person Abhishek J    schedule 10.02.2015

Решение простое.

Убедитесь, что соединитель базы данных доступен по вашему пути к классам при запуске (не компиляции) программы, например:

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

Кроме того, если вы используете старую версию Java (до JDBC 4.0), перед выполнением DriverManager.getConnection требуется эта строка:

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

При разработке с использованием Ubuntu (Xubuntu 12.04.1) мне приходилось делать следующее:

С использованием

Eclipse Juno (загружается, не устанавливается через программный центр), Tomcat 7 (загружается в пользовательский каталог) также добавляется в качестве сервера в Eclipse, динамический веб-проект с сервлетом 3.0, сервер MySQL на локальном хосте настроен и протестирован с пользователем и паролем (обязательно протестируйте) драйвер соединителя MySQL 5.1.24 jar,

Я «HAD», и я повторяю «HAD», для нас оператор Class.Load («com.mysql.jdbc.Driver») вместе с добавлением коннектора driver.jar в папку lib веб-проекта, чтобы он работал. в этой ситуации.

ВАЖНО !!: после копирования driver.jar в библиотеку обязательно обновите свой проект в Eclipse перед запуском сервлета через Tomcat.

Я попытался добавить файл jar драйвера соединителя через путь сборки с ClassLoad и без него, но это не сработало!

Надеюсь, это поможет любому, кто начинает разработку в этой конкретной ситуации: сообщество Java предоставляет «МНОГО» документации, но существует так много переменных, что трудно охватить их все, и это очень усложняет задачу новичку.

Я думаю, если бы кто-то мог объяснить, почему здесь (в этой ситуации) требуется Class.Load, это было бы полезно.

Наслаждаться

person MtlMike    schedule 14.03.2013

Поскольку никто не дал этого ответа, я также хотел бы добавить, что вы можете просто добавить файл драйвера jdbc (mysql-connector-java-5.1.27-bin.jar в моем случае) в папку lib вашего сервера (Tomcat в моем случае). Перезагрузите сервер, и он должен работать.

person Susie    schedule 03.12.2013
comment
Не очень хороший совет, особенно если у вас несколько приложений, использующих разные версии драйверов. - person Alfishe; 02.07.2014

  1. Поместите mysql-connector-java-5.0.8-bin.jar в $ CATALINA_HOME / lib

  2. Проверьте опечатку в URL-адресе подключения, пример
    «jdbc: mysql: // localhost: 3306 / report» («отчет» - это имя базы данных)

  3. Обязательно используйте имя компьютера (пример: localhost вместо IP-адреса (127.0.0.1))
person Bruce    schedule 15.08.2015

Добавьте класс драйвера в bootstrapclasspath. Проблема в java.sql.DriverManager, который не видит драйверы, загруженные ClassLoaders, кроме загрузочного ClassLoader.

person arathim    schedule 27.10.2015

Из другого потока stackoverflow:

"Во-вторых. Убедитесь, что у вас есть драйвер MySQL JDBC, также известный как Connector / J, в пути к классам JMeter. Если нет - загрузите его, распакуйте и перетащите mysql-connector-java-x.xx.xx-bin.jar в JMeter's / lib. папка. Для загрузки библиотеки потребуется перезапуск JMeter "

Убедитесь, что файл .jar добавлен непосредственно в папку lib.

person adrian filipescu    schedule 25.04.2016

Вы можете вставить банку в путь времени выполнения jboss следующим образом:

C: \ User \ user \ workspace \ jboss-as-web-7.0.0.Final \ standalone \ deployments \ MYapplicationEAR.ear \ test.war \ WEB-INF \ lib ca marche 100%

person user4983785    schedule 07.06.2015