Печально известный java.sql.SQLException: подходящий драйвер не найден - PullRequest
64 голосов
/ 16 декабря 2009

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

Само приложение прекрасно общается с Postgres, так что я знаю, что база данных работает, пользователь может получить к ней доступ, и все такое. Я пытаюсь сделать запрос к базе данных в JSP, который я добавил. Я использовал пример конфигурации в примере источника данных Tomcat практически из коробки. Необходимые теги находятся в нужном месте - никаких ошибок не возникает, если у меня просто есть ссылки на теги, поэтому он находит эти JAR-файлы. Драйвер jdbc postgres, 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]

Ответы [ 12 ]

90 голосов
/ 16 декабря 2009

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

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

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 это задокументировано здесь .

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

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

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


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

15 голосов
/ 16 декабря 2009
url="jdbc:postgresql//localhost:5432/mmas"

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

url="jdbc:postgresql://localhost:5432/mmas"
7 голосов
/ 30 апреля 2018

Я столкнулся с подобной проблемой. Мой проект в контексте - динамический веб-проект (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());
        }
5 голосов
/ 17 июля 2018

Я забыл добавить драйвер JDBC PostgreSQL в проект 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 и импортировать в свой проект вручную.

3 голосов
/ 19 января 2018

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

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

Это из поста - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

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

1 голос
/ 10 мая 2017

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

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

0 голосов
/ 14 мая 2019

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

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

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

    spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
0 голосов
/ 20 апреля 2019

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

Что я имею в виду: -

Предположим, что вы пропустили jdbc url как

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 голосов
/ 26 марта 2019

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

0 голосов
/ 19 июля 2017

У меня была именно эта проблема при разработке приложения 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;
    }
}
...