악명 높은 java.sql.SQLException : 적합한 드라이버가 없습니다.


89

기존 Tomcat 5.5 응용 프로그램 (도움이되는 경우 GeoServer 2.0.0)에 데이터베이스 사용 JSP를 추가하려고합니다.

앱 자체는 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]

내 대답을 참조하십시오 stackoverflow.com/a/38656446/632951
Pacerier

답변:


106

악명 높은 java.sql.SQLException : 적합한 드라이버가 없습니다.

이 예외는 기본적으로 두 가지 원인 이있을 수 있습니다 .

1. JDBC 드라이버가로드되지 않았습니다.

JDBC 드라이버가 서버의 자체 /lib폴더 에 있는지 확인해야 합니다.

또는 실제로 서버 관리 연결 풀 데이터 소스를 사용하지 않고 DriverManager#getConnection()WAR에서 수동으로 조작 하는 경우 JDBC 드라이버를 WAR에 배치하고 /WEB-INF/lib..

Class.forName("com.example.jdbc.Driver");

.. 첫 번째 호출 전에 코드에서 던질 수있는 것을 삼키거나 무시 DriverManager#getConnection()하지 않도록ClassNotFoundException 하고 예외가없는 것처럼 코드 흐름을 계속합니다. Tomcat의 연결 풀을위한 JDBC 드라이버를 어디에 배치해야합니까?를 참조하십시오 .

2. 또는 JDBC URL의 구문이 잘못되었습니다.

JDBC URL이 JDBC 드라이버 문서를 준수하는지 확인하고 일반적으로 대소 문자를 구분한다는 점에 유의해야합니다. 로드 된 드라이버 trueDriver#acceptsURL()대해 JDBC URL이 반환되지 않으면 정확히이 예외가 발생합니다.

PostgreSQL의 경우 여기 에 설명되어 있습니다 .

JDBC에서 데이터베이스는 URL (Uniform Resource Locator)로 표시됩니다. PostgreSQL ™에서는 다음 형식 중 하나를 사용합니다.

  • 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의 경우 여기 에 설명되어 있습니다 .

2 개의 URL 구문, SID에서만 작동하는 이전 구문과 Oracle 서비스 이름에서 새로운 구문이 있습니다.

이전 구문 jdbc:oracle:thin:@[HOST][:PORT]:SID

새로운 구문 jdbc:oracle:thin:@//[HOST][:PORT]/SERVICE


또한보십시오:


감사합니다! 죄송합니다. 첫 번째 시도는 OP가 아니라 jdbc : postgresql : mmas뿐입니다 (다른 시도도했습니다!). 슬프게도 araqnid의 URL에서도 동일한 결과가 발생합니다. 어젯밤에 나는 (ick) 임베디드 자바를 위해 tablib를 교체했는데 잘 작동한다 : try {Class.forName ( "org.postgresql.Driver"). newInstance (); con = DriverManager.getConnection ( "jdbc : postgresql : mmas", "mmas", "passwd"); stmt = con.createStatement (); rs = stmt.executeQuery ( "야다 야다 선택"); if (rs! = null && rs.next ()) {// 명성, 재산, 영광, 아가씨 자카르타 예제는 w / taglibs 였으므로 그렇게 시작했습니다.
Rick Wayne

아. 코드 서식에 대한 주석이 많지 않습니다. 에헴. 내 초보자가 보여요? (ZIIP!) 어쨌든, Jakarta 예제는 Java 코드를 포함하는 대신 <sql : query> 구문을 사용하는 것이 전부였으며 훨씬 더 깔끔한 방법이라는 데 동의합니다. forName () 및 getConnection ()을 명시 적으로 호출 할 필요는 없습니다. 그러나 오래된 추악한 해킹 드라이버 코드 프레젠테이션 레이어 방법은 잘 작동했습니다. 그래서 당황 스럽지만 이제는 "이거 고장났어, 고치거나, 버거를 뒤집는 기술을 다듬는 것"보다는 유지 관리 / 미학 문제에 더 가깝습니다.
Rick Wayne

sql taglib를 사용하는 IMHO는 스크립틀릿에서 JDBC를 수행하는 것보다 약간 낫습니다. db 작업이 선행되고 JSP가 항목을 표시하는 컨트롤러 /보기 패턴을 훨씬 선호합니다. 하지만 각각은 그들 자신이고 sql : query를 사용하면 일이 단순 해집니다. :) (ish)
araqnid 2009

나는 JSTL SQL taglib 사용에 동의한다고 말한 적이 없지만이 주제에 관한 주제는 아닙니다.
BalusC 2009

2
감사합니다. JDBC 연결 문자열 형식이 매우 유용했습니다!
제이 테일러

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

URL이 잘못된 것 같습니다. 다음이 필요합니까?

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

15

내 프로젝트 ( Mvnrepository )에 PostgreSQL JDBC 드라이버를 추가하는 것을 잊었습니다 .

Gradle :

// 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을 다운로드 하고 수동으로 프로젝트로 가져올 수도 있습니다.


12

비슷한 문제에 직면했습니다. 내 프로젝트는 Dynamic Web Project (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());
        }

3

Tomcat에서이 문제를 제거하는 데 도움이되는 다음 팁을 찾았습니다.

먼저 Class.forName ( "org.postgresql.Driver");을 수행하여 드라이버를로드해야합니다. 귀하의 코드에서.

이것은 게시물에서 가져온 것입니다-https: //www.postgresql.org/message-id/e13c14ec050510103846db6b0e@mail.gmail.com

jdbc 코드는 독립 실행 형 프로그램으로 잘 작동했지만 TOMCAT에서는 '적합한 드라이버를 찾을 수 없음'오류가 발생했습니다.


링크만으로 답변하지 마십시오-그 뒤에 무엇이 있는지 간략하게 설명하십시오!
monamona

솔루션에 대한 링크는 환영하지만 답변이없는 경우에도 유용한 지 확인하십시오 . 링크 주변에 컨텍스트를 추가 하여 동료 사용자가 그것이 무엇이고 왜 존재하는지 알 수 있도록 한 다음 페이지에서 가장 관련성이 높은 부분을 인용하십시오. 대상 페이지를 사용할 수없는 경우 다시 연결합니다. 링크에 불과한 답변은 삭제 될 수 있습니다 .
Peter

1

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

Windows JAR 파일 속성 대화 상자 :
Windows JAR 파일 속성 대화 상자


1

MySQL JDBC 커넥터를 추가 할뿐만 아니라 DB 연결 정의와 함께 context.xml (Tomcat webapps 폴더에 압축 해제되지 않은 경우)이 Tomcats conf 디렉터리에 포함되어 있는지 확인합니다.


1

결과적으로 발생할 수있는 매우 어리석은 실수는 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 끝에 공백을 줄 수 있지만 그렇게하지 않는 것이 안전합니다)


0

나는 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'

또는 운전자가 어디에 있든 그게 전부입니다!


0

STS에서 Spring Boot 애플리케이션을 개발할 때이 정확한 문제가 있었지만 궁극적으로 패키지 전쟁을 WebSphere (v.9)에 배포했습니다. 이전 답변에 따르면 내 상황은 독특했습니다. ojdbc8.jar은 Parent Last 클래스 로딩 세트가있는 내 WEB-INF / lib 폴더에 있었지만 항상 적절한 드라이버를 찾지 못했다고 말합니다.

내 궁극적 인 문제는 온라인 자습서 / 예제를 따라 가기 때문에 잘못된 DataSource 클래스를 사용하고 있다는 것입니다. 여기에 자신의 질문에 대한 David Dai의 의견 덕분에 힌트를 찾았습니다. Spring JDBC는 JDBC 드라이버 클래스를로드 할 수 없습니다 [oracle.jdbc.driver.OracleDriver]

또한 나중에 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;
    }
}

0

외부에서 작동하는 스프링 데이터를 사용하는 mysql 데이터 소스와 동일한 문제가 있었지만 바람둥이에 배포했을 때이 오류가 발생했습니다.

jres lib / ext 폴더에 드라이버 jar mysql-connector-java-8.0.16.jar을 추가하면 오류가 사라졌습니다.

그러나 다른 응용 프로그램을 방해 할 수 있다는 두려움 때문에 프로덕션에서이 작업을 수행하고 싶지 않았습니다. 드라이버 클래스를 명시 적으로 정의하면이 문제가 해결되었습니다.

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

0

실행 javaCLASSPATH드라이버의 JAR 파일, 예를 들면에 환경 변수를 가리키는

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

drivers/mssql-jdbc-6.2.1.jre8.jar드라이버 파일의 경로는 어디에 있습니까 (예 : SQL Server 용 JDBC ).

을 통해 컴파일 된 ConnectURL해당 드라이버 ( samples/connections/ConnectURL.java) 의 샘플 앱입니다 javac ConnectURL.java.


0

제 경우에는 Maven으로 Java 프로젝트에서 작업 중이 었고이 오류가 발생했습니다. 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;
    }

전화 할 필요가 없습니다 Class.forName. DriverManager찾을 수 있어야합니다.
Stephen C

당신이 옳을 수 있습니다. Java는 내 주요 코딩 언어가 아닙니다.
Justice Bringer

0

앱 어딘가에 리소스 정의가 제공되지 않은 경우에도 동일한 오류가 발생합니다 (대부분 중앙 context.xml 또는 conf / Catalina / localhost의 개별 컨텍스트 파일). 개별 컨텍스트 파일을 사용하는 경우 해당 .war 파일을 제거 / 배포 해제 할 때마다 Tomcat이 자유롭게 해당 파일을 삭제한다는 점 에 유의 하십시오.


0

이 스레드가 몇 년이 되어도 사람들은이 문제에 계속 직면 할 것입니다.

내 사례 : 최신 OpenJDK 및 maven 설정이 있습니다. 위의 모든 방법을 시도해 보았습니다. Maven 및 StackOverflow의 자매 게시물에 대한 솔루션도 있습니다. 핵심 논리만을 보여주기 위해 베어 CLI에서 실행되는 IDE 또는 다른 것을 사용하지 않습니다.

마침내 효과가 있었던 것은 다음과 같습니다.

  • 공식 사이트에서 드라이버를 다운로드하십시오. (저에게는 MySQL https://www.mysql.com/products/connector/ ). 여기에 당신의 맛을 사용하십시오.
  • Java 프로젝트와 동일한 디렉토리에 지정된 jar 파일의 압축을 풉니 다. 이와 같은 디렉토리 구조를 얻을 수 있습니다. 주의 깊게 살펴보면 .NET을 사용하여 수행하려는 작업과 정확히 관련이 Class.forName(....)있습니다. 우리가 원하는 파일은com/mysql/jdbc/Driver.class

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

  • 코드가 포함 된 Java 프로그램을 컴파일하십시오.
javac App.java
  • 이제 다음을 실행하여 director를 모듈로로드합니다.
java --module-path com/mysql/jdbc -cp ./ App

이렇게하면 (추출 된) 패키지가 수동으로로드되고 Java 프로그램이 필요한 Driver 클래스를 찾습니다.


  • 이것은 mysql드라이버에 대해 수행되었으며 다른 드라이버는 약간의 변경이 필요할 수 있습니다.
  • 공급 업체가 .deb이미지를 제공하는 경우 다음 에서 항아리를 가져올 수 있습니다./usr/share/java/your-vendor-file-here.jar

-1

XML 파일을 src/main/resources잘못 입력 하여이 문제가 발생하고 삭제 한 다음 모두 정상으로 돌아갑니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.