Печально известный java.sql.SQLException: подходящий драйвер не найден
Я пытаюсь добавить 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]
22 ответа
Печально известный 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 это задокументировано здесь.
Существует два синтаксиса URL: старый синтаксис, который будет работать только с SID, и новый с именем службы Oracle.
Старый синтаксис
jdbc:oracle:thin:@[HOST][:PORT]:SID
Новый синтаксис
jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE
Смотрите также:
- Где мне разместить драйвер JDBC для пула соединений Tomcat?
- Как установить драйвер JDBC в веб-проект Eclipse, не сталкиваясь с java.lang.ClassNotFoundexception
- Как подключиться к базе данных / источнику данных JDBC в приложении на основе сервлета?
- В чем разница между "Class.forName()" и "Class.forName(). NewInstance()"?
- Подключите Java к базе данных MySQL
Я забыл добавить драйвер 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 и импортировать в свой проект вручную.
url="jdbc:postgresql//localhost:5432/mmas"
Этот URL выглядит неправильно, вам нужно следующее?
url="jdbc:postgresql://localhost:5432/mmas"
Я сталкивался с подобной проблемой. Мой проект в контексте - динамический веб-проект (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());
}
Я нашел полезный совет, чтобы устранить эту проблему в Tomcat -
обязательно загрузите драйвер, сначала выполнив Class.forName(" org.postgresql.Driver"); в вашем коде.
Это из поста - https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com
Код jdbc работал как отдельная программа, но в TOMCAT выдавал ошибку: "Не найден подходящий драйвер"
Резюме:
Soln2 (рекомендую)::
- 1 . положить файл в формате .
Солнце1::
- 1 . положить файл в формате .
- 2 . используйте в своем Java-коде сервлета.
Солн1 (Ори Анс) //-20220304
Короче говоря:
- убедитесь, что у вас есть файл в папке
- убедитесь, что вы используете
дополнительные примечания (не важные), основанные на моих попытках (могут ошибаться):
1.1 поставить банку прямо в
Java build path
не работает1.2. положить банку в
Data management > Driver Def > MySQL JDBC Driver > then add it as library to Java Build path
не работает.1.3 => он должен быть внутри (не знаю почему)
1.4 с использованием версии работает, в Eclipse доступна только версия 5.1
MySQL JDBC Driver
настройка не имеет значения, игнорируйте ее.<см. Как подключиться к базе данных MySql 8.0 с помощью Eclipse Database Management Perspective >
-
Class.forName("com.mysql.cj.jdbc.Driver"); Class.forName("com.mysql.jdbc.Driver");
оба работают, но
Class.forName("com.mysql.jdbc.Driver");
устарела.Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
<см. https://www.yawintutor.com/no-suitable-driver-found-for-jdbcmysql-localhost3306-testdb/ >
-
Если вы хотите подключиться к базе данных MySQL, вы можете использовать драйвер типа 4 под названием Connector/}, который можно бесплатно загрузить с веб-сайта MySQL. Однако этот драйвер обычно включается в каталог lib Tomcat. В результате вам обычно не нужно загружать этот драйвер с сайта MySQL.
-- Java-сервлеты Мураха и JSP
Я не могу найти драйвер в Tomcat, о котором говорит автор, мне нужно использовать файл .<(зачеркнуто) см. обновленный ответ soln2 ниже> -
Однако, если вы работаете со старой версией Java, вам необходимо использовать метод forName класса Class для явной загрузки драйвера перед вызовом метода getConnection.
Даже с JDBC 4.0 вы иногда получаете сообщение «Подходящий драйвер не найден». В этом случае вы можете использовать метод forName класса Class для явной загрузки драйвера. Однако, если автоматическая загрузка драйвера работает, обычно имеет смысл удалить вызов этого метода из кода.
Как загрузить драйвер базы данных MySQL до JDBC 4.0
Class.forName{"com.mysql.jdbc.Driver");
-- Java-сервлеты Мураха и JSP
Я должен использовать в своей системе автоматическую загрузку классов. Не уверен, почему.<(зачеркнуто) см. обновленный ответ soln2 ниже>
Когда я использую
normal Java Project
вместо a в Eclipse,Мне нужно только добавить к
Java Build Path
напрямую,тогда я могу без проблем подключиться к JDBC.
Однако, если я использую (что в данном случае), применяются эти 2 строгих правила (позиция jar и загрузка класса).
<см. TOMCAT ON ECLIPSE java.sql.SQLException: не найден подходящий драйвер для jdbc:mysql >
Soln2 (обновленный ответ) //-20220305_12
Короче говоря:
1 . положить файл в формате .
например:
G:\pla\Java\apache-tomcat-10.0.16\lib\mysql-connector-java-8.0.28.jar
(и для затмения
Dynamic Web Project
, банка будет автоматически помещена внутрь вашего проектаJava build path > Server Runtime [Apache Tomcat v10.0]
.)
Дополнительные примечания::
для раствор1::
- положить файл в
WEB-INF/lib
.- используйте в своем Java-коде сервлета.
это создаст ПРЕДУПРЕЖДЕНИЕ:
WARNING: The web application [LearnJDBC] appears to have started a thread named [mysql-cj-abandoned-connection-cleanup] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread:
и этот ответ привел меня к soln2.
для решения2::
- помещать
mysql-connector-java-8.0.28.jar
файл в<where you install your Tomcat>/lib
.
это создаст ИНФОРМАЦИЮ:
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
вы можете просто игнорировать это.
<см. Как исправить «JAR, которые были отсканированы, но в них не были найдены TLD» в Tomcat 9.0.0M10 >
(теперь вы должны понять, что
Murach’s Java Servlets and JSP
говорил о: банке в
Tomcat/lib
и отсутствие необходимости
Class.forName("com.mysql.cj.jdbc.Driver");
)
Пробег 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
.
Независимо от того, сколько лет станет этой нити, люди будут продолжать сталкиваться с этой проблемой.
Мой случай: у меня установлена последняя (на момент публикации) установка OpenJDK и maven. Я пробовал все методы, приведенные выше, с / вне maven и даже решения в сестринских сообщениях на Stackru. Я не использую какую-либо IDE или что-либо еще, работаю из чистого CLI, чтобы продемонстрировать только базовую логику.
Вот что в итоге сработало.
- Скачайте драйвер с официального сайта. (для меня это был MySQL https://www.mysql.com/products/connector/). Используйте здесь свой вкус.
- Разархивируйте указанный файл jar в том же каталоге, что и ваш проект java. Вы получите такую структуру каталогов. Если вы посмотрите внимательно, это как раз относится к тому, что мы пытаемся делать, используя
Class.forName(....)
. Нам нужен файлcom/mysql/jdbc/Driver.class
- Скомпилируйте программу java, содержащую код.
javac App.java
- Теперь загрузите директор как модуль, запустив
java --module-path com/mysql/jdbc -cp ./ App
Это загрузит (извлеченный) пакет вручную, и ваша java-программа найдет требуемый класс драйвера.
- Обратите внимание, что это было сделано для
mysql
драйвер, другие драйверы могут потребовать незначительных изменений. - Если ваш поставщик предоставляет
.deb
изображение, вы можете получить банку из/usr/share/java/your-vendor-file-here.jar
Очень глупая ошибка, которая может быть возможна в результате, - добавление пробела в начале URL-соединения JDBC.
Я имею в виду:-
Предположим, у вас есть by mistake, учитывая как 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, но это безопасно)
Помимо добавления коннектора MySQL JDBC, убедитесь, что context.xml (если он не распакован в папке веб-приложений Tomcat) с определениями соединений с БД включен в каталог conf Tomcats.
Возможно, стоит отметить, что это также может происходить, когда Windows блокирует загрузки, которые она считает небезопасными. Эту проблему можно решить, щелкнув правой кнопкой мыши файл jar (например, ojdbc7.jar) и отметив поле "Разблокировать" внизу.
Диалог свойств файла JAR Windows:
Для меня такая же ошибка произошла при подключении к postgres при создании фрейма данных из таблицы. Это было вызвано отсутствующей зависимостью. Зависимость jdbc не была установлена. Я использовал maven для сборки, поэтому добавил необходимую зависимость в файл pom из зависимости maven
В моем случае я работал над 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;
}
Для меня добавление ниже зависимости к файлу pom.xml решено как по волшебству! У меня не было зависимости от соединителя mysql, и даже добавление jar-файла mssql jdbc в путь сборки тоже не сработало. Надеюсь, это поможет кому-то там.
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>9.4.0.jre11</version>
</dependency>
Я столкнулся с тем же исключением, но в базе данных H2, и оно появилось из-за моей первоначальной манипуляции с объектом запроса в
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (((HttpServletRequest) request).getRequestURI().startsWith("/h2-console/")) {
chain.doFilter(request, response);
return;
}
RepeatableHttpServletRequestWrapper wrappedRequest = new RepeatableHttpServletRequestWrapper((HttpServletRequest) request);
chain.doFilter(wrappedRequest, response);
}
столкнулся с той же проблемой. в моем случае двоеточие ':' перед '//' (jdbc:mysql://localhost:3306/dbname) отсутствовало, и это просто устранило проблему. убедитесь, что : и // расположены правильно.
Я столкнулся с той же ошибкой. В моем случае URL-адрес JDBC был правильным, но проблема была с classpath. Однако добавление JAR-файла соединителя MySQL в
Я использовал 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'
или где бы ни находился ваш водитель, и все тут!
У меня была та же проблема с источником данных mysql, использующим пружинные данные, которые работали бы снаружи, но выдавали эту ошибку при развертывании на tomcat.
Ошибка исчезла, когда я добавил драйвер jar mysql-connector-java-8.0.16.jar в папку jres lib/ext
Однако я не хотел делать это на производстве, опасаясь вмешательства в другие приложения. Простота определения класса драйвера решила эту проблему для меня
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
Вы получите ту же ошибку, если для вашего приложения где-то не предусмотрено определение ресурса - скорее всего, в центральном context.xml или в отдельном файле контекста в conf/Catalina/localhost. А если вы используете отдельные файлы контекста, помните, что Tomcat свободно удаляет их каждый раз, когда вы удаляете / отменяете развертывание соответствующего файла.war.
У меня была именно эта проблема при разработке приложения 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;
}
}
Я столкнулся с этой проблемой, поместив файл XML в src/main/resources
неправильно, я удалил его, а затем все вернулось на круги своя.