2017-02-09 1 views
2

Class.forName 메서드가 정적 블록을 초기화한다는 것을 알게되었습니다.JDBC의 Class.forName() 메소드는 무엇입니까?

Class.forName("com.mysql.jdbc.Driver").newInstance(); 

jdbc 4.0 이후에는이 메소드를 호출 할 필요가 없습니다. 그러나 사람들은 항상 jdbc 4.0 버전 이후에도이 방법을 사용합니다. 내 질문에 jdbc 4.0을 사용하는 경우 왜이 방법을 사용해야합니까? JDBC 4.0 및 이후 버전의 Class.forName() 메소드는 무엇입니까?

다음은 예제 코드입니다. 나는 mysql-connector.jar를 내 라이브러리에만 추가한다.이 코드를 실행하면 완벽하게 작동한다.

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306","root","root"); 
Statement stmt = con.createStatement(); 
System.out.println("Created DB Connection...."); 
+4

그냥 사람이 코드를 복사합니다. 필요 없다고 생각하면 코드없이 코드를 시험해보십시오. –

+2

jdbc 4.0에서는 "필요하지 않습니다."라고 말합니다. 이는 추가 작업이 필요 없으며이를 호출 할 필요가 없음을 의미합니다. 왜 사람들은 아직도 그것을합니까? 포스의 습관, 무지, "안전을위한"(jdbc 4.0 이전 버전에서 배포 된 코드의 위험성이 있음) 위의 중 하나를 선택할 수 있으며, 각각은 누군가에게 적용됩니다. –

+0

드라이버 jar가 시스템 클래스 경로에없고 컨텍스트 클래스 경로에만있는 경우 (예 : driver.jar이 webapplication WAR의 일부인 경우) 'Class.forName'을 사용하여 드라이버를로드해야 할 수도 있습니다. –

답변

4

주어진 FQN이 나타내는 Class 개체를 가져옵니다. 이전에로드되지 않았 으면 클래스도로드됩니다. 이것은 정적 클래스 변수를 초기화하고 정적 블록을 실행하는 부작용이 있습니다.

최근 JDBC 버전에서는 더 이상 드라이버를로드 할 필요가 없으며 이전 버전의 드라이버가 필요했고 더 이상 필요하지 않습니다.

+1

나는 더 새로운 코드 샘플을 * 사용했는지 묻는 질문을 던졌습니다. –

1

질문 : 모든 사람들이 jdbc 4.0을 사용하고 있고 그 사실을 모르고 있다는 것을 어떻게 알 수 있습니까? 구형 또는 구형 장비에서 테스트중인 사람들을 위해 추가합니다.

+0

이전 버전을 사용하고 있는지 알 수 없습니다. 그러나 항상 방어 대책을 추가하는 것은 좋은 일이 아닙니다. 누군가 이전 버전을 실행하고 있다면 스스로 처리하도록하십시오. 그들은 항상 당신이하는 것보다 그들의 운영 환경에 대해 더 많이 알고 있습니다. 당신은 거기에있는 모든 도서관 조합을 고려할 수 없습니다. –

2

한가지를 제외하고는 최신 런 타임에 꽤 무의미합니다 : 런타임 클래스 패스에 (올바른) 드라이버 병이없는 경우이 코드 줄은 정확하게 알려줍니다.

코드 줄을 제거하면 코드에서 연결을 만들려고 할 때 일반 오류가 발생합니다. 잘못된 JDBC 연결 URL을 사용하는 또 다른 매우 일반적인 실수를 포함하여 여러 가지 원인이있는 오류입니다. 그것은 문제를 해결하려고 물을 muddies.