Позорное 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:
Ответ 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
.