programing

악명 높은 java.sql.SQL 예외:적합한 운전자를 찾을 수 없음

magicmemo 2023. 5. 1. 20:50
반응형

악명 높은 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


참고 항목:

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

https://i.imgur.com/VgpwatQ.png

  • 코드가 포함된 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(오리앤)

간단히 말해서:

  1. 당신이 그것을 가지고 있는지 확인하세요.mysql-connector-java-8.0.28.jar에 파일을 합니다.WEB-INF/lib
  2. 반드시 사용하십시오.Class.forName("com.mysql.cj.jdbc.Driver");

jdbc 연결을 위한 jar & 클래스


추가 메모(중요하지 않음), 내 시도(잘못되었을 수 있음)에 기초:

  • 를 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.를 사용한 버전 1mysql-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. <(스트라이크 아웃) 아래 업데이트된 답변 soln2 참조>

  • 그러나 이전 버전의 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"); 내 시스템에서는 자동 클래스 로드가 없습니다. 왜 그런지 모르겠어요. <(스트라이크 아웃) 아래 업데이트된 답변 soln2 참조>


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].)

톰캣에 병을 넣다/lib


추가 참고 사항:

soln1::

  1. 놓다mysql-connector-java-8.0.28.jar에 파일을 합니다.WEB-INF/lib.
  2. 사용하다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의 경우:

    1. 놓다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/libClass.forName("com.mysql.cj.jdbc.Driver");)

  • 고치기 위해서는

    Tomcat 8.5.집합에 . /conf catalina.properties는 과 같습니다.tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\*.jar

    JSP 컴파일러 경고를 수정하는 방법: 하나의 JAR에서 TLD를 스캔했지만 TLD가 포함되지 않았습니까?

    Tomcat/lib jar에서 스캔 건너뛰기

Windows(윈도우)에서 안전하지 않은 것으로 간주되는 다운로드를 차단할 때도 이러한 문제가 발생할 수 있습니다.이 문제는 jar 파일(예: ojdbc7.jar)을 마우스 오른쪽 버튼으로 클릭하고 하단의 '차단 해제' 상자를 선택하여 해결할 수 있습니다.

Windows 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 종속성이 설정되지 않았습니다.빌드에 메이븐을 사용하고 있었기 때문에 메이븐 종속성에서 폼 파일에 필요한 종속성을 추가했습니다.

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

반응형