데이터베이스에 연결하는 동안 Class.forName ( "oracle.jdbc.driver.OracleDriver")의 실제 사용은 무엇입니까?


91

명령은 무엇입니까

Class.forName("oracle.jdbc.driver.OracleDriver")

Oracle 데이터베이스에 연결하는 동안 정확히 수행합니까? 같은 일을하는 다른 방법이 있습니까?


6
관련 항목 : stackoverflow.com/questions/5992126/loading-jdbc-driver 애플리케이션을 시작하는 동안 한 번만 호출해야합니다 . 응용 프로그램의 수명 동안 연결하기 전에 매번 호출 할 필요가 없습니다.
BalusC 2011

@BalusC 클래스 생성자 에서 A호출하는 별도의 클래스에 연결 세부 정보가 있고 연결이 필요한 각 서블릿에 대한 연결 필드를 얻기 위해 객체를 생성 한다고 가정 하면 Java가 건너 뛰 거나 다시로드됩니까? Class.forName("oracle.jdbc.driver.OracleDriver")AA'sClass.forName("oracle.jdbc.driver.OracleDriver")
Asif Mushtaq 2015 년

답변:


68

FQCN (정규화 된 클래스 이름)을 사용하여 클래스 개체에 대한 참조를 가져옵니다 oracle.jdbc.driver.OracleDriver.

지정된 클래스가 현재 클래스 로더에 의해로드되는지 확인하는 것 외에는 데이터베이스에 연결하는 것과 관련하여 아무 것도 "실행"하지 않습니다 . 글쓰기에는 근본적인 차이가 없습니다.

Class<?> driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
// and
Class<?> stringClass = Class.forName("java.lang.String");

Class.forName("com.example.some.jdbc.driver")호출에 표시 레거시 때문에 JDBC를 사용하는 코드 즉이다 기존의 JDBC 드라이버를로드하는 방법 .

에서 자바 튜토리얼 :

이전 버전의 JDBC에서 연결을 얻으려면 먼저 메소드를 호출하여 JDBC 드라이버를 초기화해야했습니다 Class.forName. 이 메서드에는 유형의 개체가 필요합니다 java.sql.Driver. 각 JDBC 드라이버에는 인터페이스를 구현하는 하나 이상의 클래스가 포함되어 있습니다 java.sql.Driver.
...
클래스 경로에있는 모든 JDBC 4.0 드라이버가 자동으로로드됩니다. (그러나 JDBC 4.0 이전의 모든 드라이버는 메소드를 사용하여 수동으로로드해야합니다 Class.forName.)

추가 읽기 (읽기 : 질문이 중복 됨)


29
즉, 클래스에 대한 명시 적 가져 오기없이 Driver 클래스를 사용할 수 있습니다. 이를 통해 클래스 경로에 Oracle 드라이버가 없어도 프로젝트를 빌드 할 수 있습니다.
JustinKSU

3
"레거시 방식" Class.forName()에서는 반환 된 driverClass에 대한 참조를 캡처하지 않고 호출 할 수 있으므로 언뜻보기에는 작동하지 않는 작업처럼 보입니다
matt b

11
JDBC 드라이버에는 DriverManager에 드라이버를 등록하는 정적 초기화 프로그램이 있어야하기 때문입니다. Class.forName ()을 사용할 때이 이니셜 라이저가 실행되고 드라이버가 등록됩니다. JDBC 4.0 이후 DriverManager 자체는 ServiceLoader를 사용하여 클래스 경로에서 드라이버를 찾습니다.
Mark Rotteveel 2011

1
@MattBall, 이전 JDBC 4.0과 관련하여 드라이버에 대한 참조를 얻거나 해당 드라이버 클래스의 정적 함수를 호출하면 이미 드라이버 클래스가 자동로드됩니다. 그렇다면 왜 수동으로해야 Class.forName("etc.driver")합니까?
Pacerier

1
@Pacerier 잘못된 가정. JDBC는로드하려는 드라이버를 알지 못하므로 드라이버 클래스를 참조하는 것을 알고있는 JDBC (드라이버와 무관)에는 아무것도 없습니다. 따라서 클래스로드를 트리거하는 것이 필요 합니다 . 대신 정적 메서드가 작동한다고 가정합니다 Class.forName(...).
Matt Ball

13

드라이버를 등록합니다. 다음과 같은 형식의 것 :

public class SomeDriver implements Driver {
  static {
    try {
      DriverManager.registerDriver(new SomeDriver());
    } catch (SQLException e) {
      // TODO Auto-generated catch block
    }
  }

  //etc: implemented methods
}

6

로부터 자바 JDBC 튜토리얼 :

이전 버전의 JDBC에서 연결을 얻으려면 먼저 메소드를 호출하여 JDBC 드라이버를 초기화해야했습니다 Class.forName. 클래스 경로에있는 모든 JDBC 4.0 드라이버가 자동으로로드됩니다. (그러나 JDBC 4.0 이전의 모든 드라이버는 메소드를 사용하여 수동으로로드해야합니다 Class.forName.)

따라서 Java 1.6과 함께 Oracle 11g (11.1) 드라이버를 사용하는 경우을 호출 할 필요가 없습니다 Class.forName. 그렇지 않으면 드라이버를 초기화하기 위해 호출해야합니다.


1
@Jonathan "Class.forName 메소드를 사용하여 JDBC 4.0 이전에 드라이버를 수동으로로드"한다는 것은 무엇을 의미합니까?
Aravind 2011

Class.forName호출은 클래스 로더가 주어진 클래스를로드하도록합니다. 이것은 튜토리얼에 설명 된 수동 로딩 단계입니다.
Jonathan

내 연결이 여전히없이 작업 이유 @ 조나단 그래서 class.forName();:)
아시프 Mushtaq

2

Java 6 이전에는 DriverManager클래스가 사용하려는 JDBC 드라이버를 알지 못했습니다. Class.forName("...")드라이버 클래스를 미리로드하는 방법이었습니다.

Java 6을 사용하는 경우 더 이상이 작업을 수행 할 필요가 없습니다.


예, 다음을 사용해야합니다. OracleDataSource는 이제 docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 이며 자체 URL을 만듭니다. final OracleDataSource ds = new OracleDataSource (); ds.setDriverType ( "thin"); ds.setServerName (hostName); ds.setPortNumber (포트); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); 연결 = ds.getConnection (user, pwd);
인 Rajesh 고엘

1

이 명령은 DriverManager 인스턴스에 사용할 수 있도록 Oracle jdbc 드라이버의 클래스를로드합니다. 클래스가로드 된 후 시스템을 사용하여 Oracle에 연결할 수 있습니다. 대안으로 DriverManager의 registerDriver 메소드를 사용하고 필요한 JDBC 드라이버의 인스턴스와 함께 전달할 수 있습니다.



0

oracle.jdbc.driver.OracleDriver가 아닌 oracle.jdbc.OracleDriver를 사용하십시오. Tomcat을 사용하는 경우 드라이버 jar 파일이 "WEB-INF \ lib"디렉토리에있는 경우 등록 할 필요가 없습니다. 이것을 test.jsp로 저장하고 웹 디렉토리에 넣고 Tomcat 관리자에서 웹 앱 폴더를 다시 배포합니다.

<%@ page import="java.sql.*" %>

<HTML>
<HEAD>
<TITLE>Simple JSP Oracle Test</TITLE>
</HEAD><BODY>
<%
Connection conn = null;
try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XXX.XXX:XXXX:dbName", "user", "password");
    Statement stmt = conn.createStatement();
    out.println("Connection established!");
}
catch (Exception ex)
{
    out.println("Exception: " + ex.getMessage() + "");

}
finally
{
    if (conn != null) {
        try {
            conn.close();   
        }
        catch (Exception ignored) {
            // ignore
        }
    }
}

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