악명 높은 java.sql.SQL 예외:적합한 운전자를 찾을 수 없음
기존 Tomcat 5.5 응용 프로그램(GeoServer 2.0.0, 도움이 된다면)에 데이터베이스 지원 JSP를 추가하려고 합니다.
앱 자체는 Postgres와 잘 대화하기 때문에 데이터베이스가 작동하고 사용자가 액세스할 수 있다는 것을 알고 있습니다.제가 하려는 것은 제가 추가한 JSP의 데이터베이스 쿼리입니다.Tomcat 데이터 소스 예제의 구성 예제는 기본적으로 거의 그대로 사용했습니다.필요한 태그립이 올바른 위치에 있습니다. 태그립 ref만 있으면 오류가 발생하지 않습니다. 따라서 JAR을 찾는 것입니다.postgresql-8.4.701.jdbc3.jar라는 postgresjdbc 드라이버는 $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$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]
악명 높은 java.sql.SQL 예외:적합한 운전자를 찾을 수 없음
이 예외에는 기본적으로 두 가지 원인이 있을 수 있습니다.
JDBC 드라이버가 로드되지 않았습니다.
Tomcat의 경우 JDBC 드라이버가 서버 자체에 있는지 확인해야 합니다./lib
폴더를 누릅니다.
실제로 풀 원본을 있는할 수 있습니다DriverManager#getConnection()
JDBC 의 WAR에 ./WEB-INF/lib
수행...
Class.forName("com.example.jdbc.Driver");
첫 번째 이전의 당신의 코드로.DriverManager#getConnection()
어떤 것도 삼키지 않도록 하는 전화ClassNotFoundException
이것은 그것에 의해 던져지고 예외적으로 아무 일도 일어나지 않은 것처럼 코드 흐름을 계속할 수 있습니다.참고 항목Tomcat의 연결 풀에 대한 JDBC 드라이버는 어디에 배치해야 합니까?
다른 서버에서도 JAR 파일을 배치하는 방법이 유사합니다.
- GlassFish: JAR 파일을 저장합니다.
/glassfish/lib
- WildFly: JAR 파일을 저장합니다.
/standalone/deployments
또는 JDBC URL이 잘못된 구문입니다.
JDBC URL이 JDBC 드라이버 설명서를 준수하는지 확인하고 일반적으로 대소문자를 구분합니다.이 JDBC URL을 때true
로드된 드라이버에 대해서도 이 예외가 적용됩니다.
Postgre의 경우SQL은 여기에 문서화되어 있습니다.
JDBC에서는 데이터베이스가 URL(Uniform Resource Locator)로 표시됩니다.Postgre 포함SQL™. 이 형식은 다음 중 하나입니다.
jdbc:postgresql:database
jdbc:postgresql://host/database
jdbc:postgresql://host:port/database
MySQL의 경우 여기에 설명되어 있습니다.
하기 위한 과 같습니다 항목은 대괄호(MySQL 서버의위 JDBC URL)로 구분됩니다.
[ ]
사항임:
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
참고 항목:
- Tomcat의 연결 풀에 대한 JDBC 드라이버를 어디에 배치해야 합니까?
- java.lang을 마주하지 않고 이클립스 웹 프로젝트에 JDBC 드라이버를 설치하는 방법.클래스를 찾을 수 없음 예외
- 서블릿 기반 애플리케이션에서 JDBC 데이터베이스/데이터 소스에 연결하려면 어떻게 해야 합니까?
- "Class.forName()"과 "Class.forName().newInstance()"의 차이점은 무엇입니까?
- MySQL 데이터베이스에 Java 연결
Postgre를 추가하는 것을 잊었습니다.SQL JDBC Driver를 내 프로젝트(Mvnrepository)에 설치합니다.
그라들:
// http://mvnrepository.com/artifact/postgresql/postgresql
compile group: 'postgresql', name: 'postgresql', version: '9.0-801.jdbc4'
메이븐:
<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)이며 오류는 Postgre에 대한 것입니다.SQL 드라이버 예외:적합한 운전자를 찾을 수 없음
다음을 추가하여 해결되었습니다.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")을 수행하여 드라이버를 먼저 로드해야 합니다."운전자"; 코드에 있습니다.
이것은 포스트 https://www.postgresql.org/message-id/e13c14ec050510103846db6b0e @mail.gmail.com 에서 온 것입니다.
jdbc 코드는 독립 실행형 프로그램으로 잘 작동했지만 TOMCAT에서 '적절한 드라이버를 찾을 수 없습니다.'라는 오류가 발생했습니다.
이 스레드가 아무리 오래되어도 사람들은 계속해서 이 문제에 직면할 것입니다.
내 케이스:최신 OpenJDK 및 메이븐 설정이 있습니다.저는 StackOverflow의 자매 게시물에 있는 모든 방법을 사용하거나 사용하지 않고 해결책을 시도했습니다.저는 핵심 논리만 시연하기 위해 맨 CLI에서 실행되는 IDE나 다른 것을 사용하지 않습니다.
여기에 마침내 성공한 것이 있습니다.
- 공식 사이트에서 드라이버를 다운로드합니다.(저에게는 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
요약:.
Soln2(권장):
- 을 넣다 놓다
mysql-connector-java-8.0.28.jar
에 파일을 합니다.<where you install your Tomcat>/lib
.
- 을 넣다 놓다
솔루션 1:
- 을 넣다 놓다
mysql-connector-java-8.0.28.jar
에 파일을 합니다.WEB-INF/lib
. - 2. 합니다. 사용
Class.forName("com.mysql.cj.jdbc.Driver");
사용자의 서블릿 Java 코드에 있습니다.
- 을 넣다 놓다
Soln1(오리앤)
간단히 말해서:
- 당신이 그것을 가지고 있는지 확인하세요.
mysql-connector-java-8.0.28.jar
에 파일을 합니다.WEB-INF/lib
- 반드시 사용하십시오.
Class.forName("com.mysql.cj.jdbc.Driver");
추가 메모(중요하지 않음), 내 시도(잘못되었을 수 있음)에 기초:
를 1.1 을직 내에 넣는 것부 접병 ▁the것 ▁inside▁the 안에 직접 넣음
Java build path
하지 않습니다.병을 1.2에
Data management > Driver Def > MySQL JDBC Driver > then add it as library to Java Build path
작동하지 않습니다.> 1.3 => 내에있합니 안에 합니다.
WEB-INF/lib
(이유는 모르겠습니다)1.를 사용한 버전 1
mysql-connector-java-8.0.28.jar
5할 수 있습니다.MySQL JDBC Driver
설정은 중요하지 않습니다. 무시하십시오.<이클립스 데이터베이스 관리 관점을 사용하여 MySql 8.0 데이터베이스에 연결하는 방법 참조>
-
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 데이터베이스에 연결하려면 MySQL 웹 사이트에서 무료로 사용할 수 있는 Connector/}이라는 유형 4 드라이버를 사용할 수 있습니다.그러나 이 드라이버는 일반적으로 Tomcat의 lib 디렉터리에 포함되어 있습니다.따라서 일반적으로 MySQL 사이트에서 이 드라이버를 다운로드할 필요가 없습니다.
무라흐의 자바 서블릿과 JSP
작성자가 말하는 Tomcat에서 드라이버를 찾을 수 없습니다. 사용해야 합니다.mysql-connector-java-8.0.28.jar
. -
그러나 이전 버전의 Java로 작업하는 경우 getConnection 메서드를 호출하기 전에 클래스 클래스의 forName 메서드를 사용하여 드라이버를 명시적으로 로드해야 합니다.
JDBC 4.0에서도 "적절한 드라이버를 찾을 수 없습니다."라는 메시지가 나타날 수 있습니다.이 경우 클래스 클래스의 forName 메서드를 사용하여 드라이버를 명시적으로 로드할 수 있습니다.그러나 자동 드라이버 로드가 작동하는 경우 일반적으로 코드에서 이 메서드 호출을 제거하는 것이 좋습니다.
JDBC 4.0 이전 버전의 MySQL 데이터베이스 드라이버를 로드하는 방법
Class.forName{"com.mysql.jdbc.Driver");
무라흐의 자바 서블릿과 JSP
사용해야 합니다.Class.forName("com.mysql.cj.jdbc.Driver");
내 시스템에서는 자동 클래스 로드가 없습니다.왜 그런지 모르겠어요.
가 중경우인용을 때.
normal Java Project
신에대Dynamic Web Project
.
mysql-connector-java-8.0.28.jar
Java Build Path
접로으적직,로,그러면 JDBC에 문제없이 연결할 수 있습니다.
하지만, 만약 내가 사용하고 있다면,
Dynamic Web Project
(이 경우), 두 가지 엄격한 규칙이 적용됩니다(항아리 위치 및 클래스 적재).<이클립스 java.sql의 톰캣 참조.SQL 예외: jdbc:mysql >에 적합한 드라이버를 찾을 수 없습니다.
Soln2(업데이트된 Ans)
간단히 말해서:
을 넣다 놓다
mysql-connector-java-8.0.28.jar
에 파일을 합니다.<where you install your Tomcat>/lib
.예:
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]
.)
추가 참고 사항:
soln1::
- 놓다
mysql-connector-java-8.0.28.jar
에 파일을 합니다.WEB-INF/lib
.- 사용하다
Class.forName("com.mysql.cj.jdbc.Driver");
사용자의 서블릿 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:
<참조 웹 응용 프로그램 []이(가) [Abandoned connection cleanup thread] com.mysql.jdbc라는 스레드를 시작한 것 같습니다.포기된 연결 정리스레드 >
그리고 그 대답은 저를 솔2로 이끌었습니다.
soln2의 경우:
-
- 놓다
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.
- 놓다
가볍게 그냥 무시하면 되겠습니다.
<Tomcat 9.0.0M10의 "스캔되었지만 TLD가 발견되지 않은 JARs"를 수정하는 방법 참조>
무엇을 .
Murach’s Java Servlets and JSP
에 대해 이야기하고 있었습니다: 항아리 안에 있습니다.Tomcat/lib
의Class.forName("com.mysql.cj.jdbc.Driver");
)고치기 위해서는
Tomcat 8.5.집합에 . /conf catalina.properties는 과 같습니다.
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\*.jar
Windows(윈도우)에서 안전하지 않은 것으로 간주되는 다운로드를 차단할 때도 이러한 문제가 발생할 수 있습니다.이 문제는 jar 파일(예: ojdbc7.jar)을 마우스 오른쪽 버튼으로 클릭하고 하단의 '차단 해제' 상자를 선택하여 해결할 수 있습니다.
Windows JAR 파일 속성 대화 상자:
MySQL JDBC 커넥터를 추가할 뿐만 아니라 DB 연결 정의가 포함된 context.xml(Tomcat webapps 폴더에 압축이 풀리지 않은 경우)이 Tomcats conf 디렉토리에 포함되어 있는지 확인합니다.
결과적으로 발생할 수 있는 매우 어리석은 실수는 JDBC URL 연결의 시작 부분에 공간을 추가하는 것입니다.
내 말은...
당신이 실수로 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 끝에 공백을 줄 수 있지만 그렇지 않은 것이 안전합니다.)
려달을 합니다.java
와 함께CLASSPATH
운전자의 JAR 파일을 가리키는 환경 변수(예:
CLASSPATH='.:drivers/mssql-jdbc-6.2.1.jre8.jar' java ConnectURL
에▁where디drivers/mssql-jdbc-6.2.1.jre8.jar
드라이버 파일의 경로입니다(예: SQL Server용 JDBC).
그ConnectURL
그 입니까?samples/connections/ConnectURL.java
, 를 컴파일됨javac ConnectURL.java
.
jruby를 사용하고 있었습니다. 이 경우 config/initializer에서 생성했습니다.
postgres_driver.dll
$CLASSPATH << '~/.rbenv/versions/jruby-1.7.17/lib/ruby/gems/shared/gems/jdbc-postgres-9.4.1200/lib/postgresql-9.4-1200.jdbc4.jar'
아니면 당신의 운전자가 어디에 있든, 그게 다예요!
STS에서 Spring Boot 애플리케이션을 개발할 때 바로 이 문제가 발생했지만, 결국 패키지 전쟁을 WebSphere(v.9)에 배포했습니다.이전 답변에 따르면 저의 상황은 독특했습니다.ojdbc8.jar는 부모 마지막 클래스 로드 세트가 있는 WEB-INF/lib 폴더에 있었지만 항상 적합한 드라이버를 찾지 못했다고 말합니다.
온라인 튜토리얼/예제를 따라가면서 잘못된 DataSource 클래스를 사용하는 것이 문제였습니다.여기서 데이비드 다이의 질문에 대한 댓글 덕분에 힌트를 찾았습니다: 봄 JDBC Could not load JDBC driver class [oracle.jdbc.driver].오라클 드라이버]
또한 나중에 Oracle 전용 드라이버로 spring guru 예제를 발견했습니다. 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;
}
}
외부에서 작동하는 스프링 데이터를 사용하는 mysql 데이터 소스에서도 동일한 문제가 발생했지만 Tomcat에 배포할 때 이 오류가 발생했습니다.
드라이버 jar mysql-connector-java-8.0.16.jar를 jreslib/ext 폴더에 추가했을 때 오류가 사라졌습니다.
그러나 다른 애플리케이션에 방해가 될까봐 프로덕션에서 이 작업을 수행하고 싶지 않았습니다.드라이버 클래스를 정의하는 유연성이 이 문제를 해결했습니다.
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
앱에 대해 제공된 리소스 정의가 없는 경우에도 동일한 오류가 발생합니다. 대부분 central context.xml 또는 conf/Catalina/localhost의 개별 컨텍스트 파일에 있습니다.그리고 개별 컨텍스트 파일을 사용하는 경우 해당 .war 파일을 제거/배포할 때마다 Tomcat이 해당 파일을 자유롭게 삭제하도록 주의하십시오.
테이블에서 데이터 프레임을 생성하는 동안 postgres에 연결하는 동안 동일한 오류가 발생했습니다.종속성이 누락되어 발생했습니다. jdbc 종속성이 설정되지 않았습니다.빌드에 메이븐을 사용하고 있었기 때문에 메이븐 종속성에서 폼 파일에 필요한 종속성을 추가했습니다.
pom.xml 파일에 아래의 의존성을 추가하는 것은 마법처럼 해결되었습니다!mysql 커넥터 종속성이 없었고 mssql jdbc jar 파일을 빌드 경로에 추가하는 것도 작동하지 않았습니다.
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>9.4.0.jre11</version>
</dependency>
저의 경우 메이븐과 자바 프로젝트를 진행하던 중 이 오류가 발생했습니다.pom.xml 파일에서 이 종속성이 있는지 확인합니다.
<dependencies>
<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;
}
같은 문제에 직면했습니다.제 경우 '//' 앞의 ':' 콜론(jdbc:colon://localhost:3306/dbname)이 누락되어 문제가 해결되었습니다. : 및 //가 올바르게 배치되었는지 확인하십시오.
저도 같은 오류에 부딪혔습니다.저의 경우 JDBC URL은 맞지만 classpath에 문제가 있었습니다.그러나 MySQL 커넥터의 JAR 파일을 에 추가하는 중-classpath
또는-cp
(또는 IDE의 경우 라이브러리로) 문제가 해결되지 않습니다.을 자바 그서나는래파바코드위이트옮다것실할니입행야해겨서치로자일바을▁so▁to▁move다▁have▁to▁run것▁will그니입▁i래▁thecode▁byte를 실행해야 할 것입니다.java -cp :mysql_connector.jar
이 일을 성공시키기 위해.만약 누군가가 저와 같은 문제에 부딪히면, 저는 이것을 여기에 남겨둘 것입니다.
파일에 삽입하여 이 했습니다.src/main/resources
제가 잘못 삭제했다가 다시 정상으로 돌아왔습니다.
언급URL : https://stackoverflow.com/questions/1911253/the-infamous-java-sql-sqlexception-no-suitable-driver-found
'programing' 카테고리의 다른 글
열 유형을 변경하고 null이 아님을 설정합니다. (0) | 2023.05.06 |
---|---|
기본 제약 조건을 추가하는 명령 (0) | 2023.05.01 |
Angular with Angular CLI의 특정 버전을 설치하는 방법은 무엇입니까? (0) | 2023.05.01 |
git diff'는 라인 번호와 변경된 파일 이름만 표시할 수 있습니까? (0) | 2023.05.01 |
포크를 정리하고 업스트림에서 다시 시작합니다. (0) | 2023.05.01 |