Печально известный java.sql.SQLException: подходящий драйвер не найден


89

Я пытаюсь добавить JSP с поддержкой базы данных в существующее приложение Tomcat 5.5 (GeoServer 2.0.0, если это помогает).

Само приложение прекрасно взаимодействует с Postgres, поэтому я знаю, что база данных работает, пользователь может получить к ней доступ и все такое хорошее. Я пытаюсь выполнить запрос к базе данных в добавленном мной JSP. Я использовал пример конфигурации в примере с источником данных Tomcat практически сразу после установки. Необходимые библиотеки тегов находятся в нужном месте - ошибок не возникает, если у меня есть только ссылки на библиотеки тегов, поэтому он находит эти JAR. Драйвер postgres jdbc, postgresql-8.4.701.jdbc3.jar находится в $ CATALINA_HOME / common / lib.

Вот начало 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>

Соответствующий раздел из $ CATALINA_HOME / conf / server.xml, внутри <Host>которого, в свою очередь, находится внутри <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>

Эти строки являются последними в теге в 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>

Наконец, исключение:

   exception
    org.apache.jasper.JasperException: Unable to get connection, DataSource invalid: "java.sql.SQLException: No suitable driver"
    [...wads of ensuing goo elided]

Ответы:


106

Печально известный java.sql.SQLException: подходящий драйвер не найден

Это исключение может иметь две основные причины:

1. Драйвер JDBC не загружен

Вам необходимо убедиться, что драйвер JDBC находится в собственной /libпапке сервера .

Или, если вы на самом деле не используете управляемый сервером источник данных пула соединений, а вручную возитесь с DriverManager#getConnection()WAR, вам нужно поместить драйвер JDBC в WAR /WEB-INF/libи выполнить ..

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

.. в вашем коде перед первым DriverManager#getConnection()вызовом, посредством чего вы убедитесь, что вы не проглатываете / игнорируете все, ClassNotFoundExceptionчто может быть выброшено им, и продолжаете поток кода, как будто ничего особенного не произошло. См. Также Где мне нужно разместить драйвер JDBC для пула соединений Tomcat?

2. Или URL-адрес JDBC имеет неправильный синтаксис.

Вы должны убедиться, что URL-адрес JDBC соответствует документации драйвера JDBC, и помните, что он обычно чувствителен к регистру. Когда URL JDBC не возвращается trueдля Driver#acceptsURL()любого из загруженных драйверов, то вы также получите именно это исключение.

В случае PostgreSQL это описано здесь .

В JDBC база данных представлена ​​URL-адресом (унифицированный указатель ресурсов). В PostgreSQL ™ это принимает одну из следующих форм:

  • jdbc:postgresql:database
  • jdbc:postgresql://host/database
  • jdbc:postgresql://host:port/database

В случае MySQL это описано здесь .

Общий формат URL-адреса JDBC для подключения к серверу MySQL следующий, при этом элементы в квадратных скобках ( [ ]) являются необязательными:

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

В случае Oracle это описано здесь .

Есть 2 синтаксиса URL: старый синтаксис, который будет работать только с SID, и новый синтаксис с именем службы Oracle.

Старый синтаксис jdbc:oracle:thin:@[HOST][:PORT]:SID

Новый синтаксис jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


Смотрите также:


Спасибо ребята! Извините, 1-я попытка не была в OP, просто jdbc: postgresql: mmas (и я пробовал другие!). К сожалению, с URL-адресом araqnid результат тот же. Вчера вечером я поменял местами содержимое tablib на (ick) встроенную Java, и это отлично работает: попробуйте {Class.forName ("org.postgresql.Driver"). NewInstance (); con = DriverManager.getConnection («jdbc: postgresql: mmas», «mmas», «passwd»); stmt = con.createStatement (); rs = stmt.executeQuery ("выберите yada yada"); if (rs! = null && rs.next ()) {// пожинаем славу, удачу, славу, детки. Пример Джакарты был с taglibs, поэтому я начал с этого.
Рик Уэйн,

Ах. Комментарии не так много с форматированием кода. Кхм. Показывает мой новичок? (ZIIP!) В любом случае, пример Джакарты был посвящен использованию синтаксиса <sql: query> вместо простого встраивания Java-кода, и я согласен, что это гораздо более чистый способ сделать это. Не нужно явно вызывать forName () и getConnection (), верно? Но старый уродливый метод «взломать код драйвера на уровне представления» сработал отлично, с первого раза. Так что я сбит с толку, но теперь это больше проблема обслуживания / эстетики, чем «Это сломано, почините это или освежите свои навыки переворачивания гамбургеров».
Рик Уэйн

ИМХО, использование sql taglib лишь немного лучше, чем выполнение JDBC в скриптлетах ... я предпочитаю шаблон контроллера / представления, где материал db выполняется заранее, а JSP просто отображает материал. Но каждый сам по себе, и использование sql: query
упрощает задачу

Я никогда не говорил, что согласен с использованием JSTL SQL taglib, но это не тема, о которой идет речь.
BalusC

2
Спасибо, ваши форматы строк подключения JDBC были чрезвычайно полезны!
Джей Тейлор

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

Этот URL выглядит неправильно, вам нужно следующее?

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

15

Я забыл добавить драйвер PostgreSQL JDBC в свой проект ( Mvnrepository ).

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>

Вы также можете загрузить с JAR и импортировать в ваш проект вручную.


12

Я столкнулся с аналогичной проблемой. Мой проект в контексте - это динамический веб-проект (Java 8 + Tomcat 8), а ошибка связана с исключением драйвера PostgreSQL: подходящий драйвер не найден

Это было решено добавлением Class.forName("org.postgresql.Driver")перед вызовом getConnection()метода

Вот мой пример кода:

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

3

Я нашел следующий совет полезным, чтобы устранить эту проблему в Tomcat -

не забудьте сначала загрузить драйвер, выполнив Class.forName ("org.postgresql.Driver"); в вашем коде.

Это из сообщения - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

Код jdbc работал нормально как отдельная программа, но в TOMCAT он выдавал ошибку: «Подходящий драйвер не найден».


Пожалуйста, не ссылайтесь, только ответы - опишите кратко, что за этим стоит!
monamona

Ссылка на решение приветствуется, но убедитесь, что ваш ответ полезен и без нее: добавьте контекст вокруг ссылки, чтобы ваши коллеги-пользователи имели некоторое представление о том, что это такое и почему оно есть, затем процитируйте наиболее релевантную часть страницы, которую вы ' повторная ссылка на, если целевая страница недоступна. Ответы, которые представляют собой не более чем ссылку, могут быть удалены .
Питер

1

Возможно, стоит отметить, что это также может произойти, когда Windows блокирует загрузки, которые она считает небезопасными. Эту проблему можно решить, щелкнув правой кнопкой мыши файл jar (например, ojdbc7.jar) и установив флажок «Разблокировать» внизу.

Диалог свойств файла Windows JAR :
Диалог свойств файла Windows JAR


1

Помимо добавления соединителя MySQL JDBC, убедитесь, что context.xml (если он не распакован в папке Tomcat webapps) с определениями подключения к БД включен в каталог Tomcats conf.


1

Очень глупая ошибка, результатом которой может стать добавление пробела в начале URL-адреса JDBC.

Я имею в виду:-

предположим, вы по ошибке дали URL-адрес jdbc, например

String jdbcUrl=" jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(Обратите внимание, что в начале URL-адреса есть пробел, это приведет к ошибке)

правильный путь должен быть:

String jdbcUrl="jdbc:mysql://localhost:3306/web_customer_tracker?useSSL=false&serverTimeZone=UTC";

(Обратите внимание, что во взгляде нет пробела, вы можете оставить пробел в конце URL-адреса, но это безопасно)


0

Я использовал jruby, в моем случае я создал в 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'

или где бы ни был ваш водитель, и все!


0

У меня возникла именно эта проблема при разработке приложения Spring Boot в STS, но в конечном итоге при развертывании пакетной войны в WebSphere (v.9). Судя по предыдущим ответам, моя ситуация была уникальной. ojdbc8.jar находился в моей папке WEB-INF / lib с набором загрузки класса Parent Last, но всегда говорилось, что не удалось найти подходящий драйвер.

Моя основная проблема заключалась в том, что я использовал неправильный класс DataSource, потому что я просто следил за онлайн-учебниками / примерами. Нашел подсказку благодаря комментарию Дэвида Дая по его собственному вопросу здесь: Spring JDBC Не удалось загрузить класс драйвера JDBC [oracle.jdbc.driver.OracleDriver]

Также позже был найден пример spring guru с конкретным драйвером Oracle: https://springframework.guru/configuring-spring-boot-for-oracle/

Пример, который вызывает ошибку, используя org.springframework.jdbc.datasource.DriverManagerDataSourceна основе общих примеров.

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

И исправленный пример с использованием 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;
    }
}

0

У меня была такая же проблема с источником данных mysql, использующим данные Spring, которые работали бы снаружи, но дали мне эту ошибку при развертывании на tomcat.

Ошибка исчезла, когда я добавил драйвер jar mysql-connector-java-8.0.16.jar в папку jres lib / ext.

Однако я не хотел делать это в производственной среде из-за боязни помешать работе других приложений. Явное определение класса драйвера решило эту проблему для меня

    spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver

0

Запустите javaс CLASSPATHпеременной окружения, указывающей на файл JAR драйвера, например

CLASSPATH='.:drivers/mssql-jdbc-6.2.1.jre8.jar' java ConnectURL

Где drivers/mssql-jdbc-6.2.1.jre8.jarпуть к файлу драйвера (например, JDBC для SQL Server ).

Это ConnectURLобразец приложения из этого драйвера ( samples/connections/ConnectURL.java), скомпилированный с помощью javac ConnectURL.java.


0

В моем случае я работал над Java-проектом с Maven и столкнулся с этой ошибкой. В вашем файле pom.xml убедитесь, что у вас есть эти зависимости

<dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.11</version>
    </dependency>
  </dependencies>

и где вы создаете соединение, есть что-то вроде этого

public Connection createConnection() {
        try {
            String url = "jdbc:mysql://localhost:3306/yourDatabaseName";
            String username = "root"; //your my sql username here
            String password = "1234"; //your mysql password here

            Class.forName("com.mysql.cj.jdbc.Driver");
            return DriverManager.getConnection(url, username, password);
        } catch (SQLException | ClassNotFoundException e) {
            e.printStackTrace();
        }

        return null;
    }

Вам не нужно звонить Class.forName. DriverManagerдолжен уметь его найти.
Стивен С.

Вы можете быть правы. Java не является моим основным языком программирования.
Justice Bringer

0

Вы получите ту же ошибку, если где-то для вашего приложения не предусмотрено определение ресурса - скорее всего, в центральном context.xml или в отдельном файле контекста в conf / Catalina / localhost. А если вы используете отдельные файлы контекста, помните, что Tomcat свободно удаляет их каждый раз, когда вы удаляете / отменяете развертывание соответствующего файла .war.


0

Независимо от того, сколько лет станет этой нити, люди будут продолжать сталкиваться с этой проблемой.

Мой случай: у меня есть последняя (на момент публикации) установка OpenJDK и maven. Я пробовал все методы, приведенные выше, с / вне maven и даже решения в родственных сообщениях на StackOverflow. Я не использую какую-либо IDE или что-либо еще, работаю из чистого CLI, чтобы продемонстрировать только базовую логику.

Вот что в итоге сработало.

  • Скачайте драйвер с официального сайта. (для меня это был MySQL https://www.mysql.com/products/connector/ ). Используйте здесь свой вкус.
  • Разархивируйте данный файл jar в тот же каталог, что и ваш проект java. Вы получите такую ​​структуру каталогов. Если присмотреться, это как раз относится к тому, что мы пытаемся использовать Class.forName(....). Нам нужен файлcom/mysql/jdbc/Driver.class

https://i.imgur.com/VgpwatQ.png

  • Скомпилируйте программу java, содержащую код.
javac App.java
  • Теперь загрузите директор как модуль, запустив
java --module-path com/mysql/jdbc -cp ./ App

Это загрузит (извлеченный) пакет вручную, и ваша java-программа найдет требуемый класс драйвера.


  • Обратите внимание, что это было сделано для mysqlдрайвера, другие драйверы могут потребовать незначительных изменений.
  • Если ваш поставщик предоставляет .debизображение, вы можете получить банку из/usr/share/java/your-vendor-file-here.jar

-1

Я столкнулся с этой проблемой, src/main/resourcesнеправильно поместив XML-файл , я удалил его, а затем все вернулся в нормальное состояние.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.