Позорное java.sql.SQLException: не найдено подходящего драйвера

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

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

Ответы

Ответ 1

Позорное 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-адресом (Uniform Resource Locator). В 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


См. также:

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

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

Это из поста - https://www.postgresql.org/message-id/[email protected]

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

Ответ 6

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

Диалоговое окно свойств файла JAR для Windows:
Windows JAR File Properties Dialog

Ответ 7

Я использовал 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'

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

Ответ 8

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

Ответ 9

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

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

Также был найден пример Spring гуру с конкретным драйвером 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;
    }
}

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

Ответ 10

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

Ответ 11

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

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

Предположим, у вас есть bymistake, учитывая как 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, но это безопасно)

Ответ 12

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

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

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

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

Ответ 13

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

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

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

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