2011-01-09 6 views
10

데이터베이스에 연결할 때 Class.forName("com.mysql.jdbc.Driver");Class.forName("com.mysql.jdbc.Driver").newInstance();이 모두 작동하는 이유가 궁금합니다. 새로운 인스턴스가 만들어지지 않았기 때문에 이전에는 작동하지 않아도되지 않습니다. 그리고 아직까지도 효과가 있습니다. 임 netbeans를 사용하여 6.9.1. 귀하의 의견을 보내 주셔서 감사합니다!JDBC 연결 - Class.forName과 Class.forName(). newInstance?

답변

10

Class.forName("xxx")은 데이터베이스에 대한 연결을 생성하지 않고 단지 JDBC 드라이버를로드하고 이후에 DriverManager.getConnection(...) 호출이 작동하도록 등록합니다. 드라이버를 직접 인스턴스화 할 필요는 없습니다.

+0

감사합니다. 마지막으로 qn- 인스턴스화하면 이후의 DriverManager.getConnection (..)이 다시 인스턴스화하지 않습니다. 올바른가? 첫 번째 단계에서 인스턴스화하지 않은 경우에만 그렇게됩니다. – OckhamsRazor

+0

클래스를로드하는 것만으로는 드라이버 관리자가 드라이버에서 정적 블록에 의해 트리거 된 것으로 이미 생각한 것 같습니다. 솔직히 말해서, 나는 완전히 확신하지 못합니다. 인스턴스화 한 드라이버 (예 : 랩 어라운드)를 사용하려면 DriverManager를 사용하여 연결을 피하거나 DriverManager 정적 메서드를 사용하여 드라이버 인스턴스를 등록해야합니다. – araqnid

1

jdbc 4.0을 지원하는 드라이버를 사용하면 Class.forName()도 필요하지 않습니다. 드라이버는 DriverManager가 그것을 찾을 때 을 즉석에서로드 할 수있는 메커니즘을 가지고 있다고 가정합니다.

(참조 : http://download.oracle.com/javase/6/docs/api/java/sql/DriverManager.html) DriverManager 메소드 getConnection 및 getDrivers가 Java Standard Edition 서비스 제공자 메커니즘을 지원하도록 향상되었습니다. JDBC 4.0 드라이버는 META-INF/services/java.sql.Driver 파일을 포함해야합니다. 이 파일에는 java.sql.Driver의 JDBC 드라이버 구현 이름이 들어 있습니다.

응용 프로그램이 더 이상 필요

my.sql.Driver가 명시 적으로 예를 들어, my.sql.Driver가 클래스를로드하려면 META-INF/서비스/java.sql.Driver 파일 항목을 포함됩니다 Class.forName()을 사용하여 JDBC 드라이버를로드하십시오. 현재 Class.forName()을 사용하여 JDBC 드라이버를로드하는 기존 프로그램은 수정하지 않고 계속 작동합니다.