2008-11-06 7 views
3

[1] JDBC에서 Class.forName ("일부 드라이버 이름")을 사용하여 드라이버를 처음로드해야하는 이유는 무엇입니까? getConnection() 메소드 자체 내에서 SUN이 드라이버를로드하지 못하는 이유는 무엇입니까? getConnection() 메소드의 매개 변수로 드라이버 이름을 전달하면 어떻게됩니까?JDBC 내부 이해

[2] JBDC 내부 구조를 이해하고 싶습니다.이 부분에 대한 모든 의견을 환영합니다.

JDBC 4

답변

8

, 당신은 더 이상 하나 개의 문서는이 문제를 설명하기위한 here를 참조 Class.forName을 (...)를 사용할 필요가 없습니다 :

데이터베이스에 연결 적절한 JDBC 데이터베이스 드라이버를로드 할 것을 요구한다 클라이언트의 VM. JDBC 초기에는 Class.forName()을 통해 적절한 드라이버를로드하고 JDBC 드라이버 인터페이스를 구현하는 클래스의 이름을 전달하는 것이 일반적이었습니다. DriverManager 클래스는 나중에 클라이언트 응용 프로그램에서보다 유연한 JDBC 드라이버 관리 방법을 제공합니다. 드라이버를 사용할 수있게하려면 DriverManager의 registerDriver()를 드라이버의 클래스 이름과 함께 호출해야합니다. 또는 jdbc.drivers 시스템 등록 정보를 통해로드 할 드라이버를 지정할 수 있습니다. DriverManager가 초기화되면 해당 속성과 연결된 드라이버를로드하려고 시도합니다.

JDBC 4는 데이터베이스 드라이버를 지정하는 또 다른 수단으로 J2SE 서비스 제공 업체 메커니즘을 추가합니다. 이렇게하려면 드라이버 JAR 파일에 META-INF/services/java.sql.driver 파일이 있어야합니다. 이 파일에는 Driver 인터페이스의 JDBC 드라이버 구현 이름이있는 단일 행이 있어야합니다. DriverManager에서 getConnection()을 호출하면 필요한 경우 패키지 된 드라이버가로드됩니다. 드라이버를로드하면 드라이버의 인스턴스가 만들어지고 registerDriver()가 호출되어 클라이언트에서 해당 드라이버를 사용할 수있게됩니다.

JDBC에 대한 자세한 내용은 Sun's JDBC link을 참조하십시오. JDBC 4.0 스펙은 다른 스펙에 비해 상대적으로 좋은 읽기입니다 ...

1

java.sql은 JDBC 프로토콜 이름 만 지정하면로드 할 클래스를 알 수 없습니다. 아마 JDBC 드라이버 jar 파일은 매니페스트 내 또는 META-INF/아래의 다른 곳에서 프로토콜 이름과 드라이버 클래스를 지정할 수 있어야합니다. 내 견해로, 당신은 직접 드라이버 인스턴스를 구성 할 수 있습니다. 직접 하드 와이어 된 문자열이나 fiddly 서비스 파일로 클래스를로드하려고 시도하지 마십시오.

JDBC 자체에는 그다지 많은 부분이 없습니다. 소스는 JDK의 src.zip에 있습니다. DriverManager는 코드가있는 클래스입니다.

0

툴킷이 맞습니다. JDBC 4.0 이후에는 드라이버가 J2SE 서비스 공급자을 사용하여 자동으로 등록되는 메커니즘이 있습니다. 불행히도 모든 JDBC 공급 업체가 드라이버를 업데이트하지는 않습니다. 또한 현재 JDBC 4.0을 지원하는 JDBC 드라이버가별로 없다고 생각합니다. 한편 드라이버를 등록하려면 드라이버의 인스턴스를 만들어야합니다. DriverManager는 DriverManager.getConnection()에 전달 된 JDBC URL을 수락하면 등록 된 각 드라이버를 확인합니다. 드라이버 로깅을 활성화하여 드라이버가 등록되어 있고 DriverManager가 적합한 드라이버를 찾으려고하면 어떤 일이 발생하는지 확인할 수 있습니다. 따라서 전에 DriverManager.setLogStream() 또는 DriverManager.setLogWriter()를 호출하십시오.

이것은 내가 알고있는 JDBC 4.0 드라이버 중 하나입니다. http://www.inetsoftware.de/products/jdbc/mssql/merlia