2011-05-13 16 views
10

Powiedziano mi, że preferowana metoda, aby załadować sterownika JDBC jest:Ładowanie JDBC kierowca

Class.forName(driverName); 

Rozumiem, że to jest lepsze dla dynamicznej decyzji pomiędzy wielu kierowców może czytać z pliku konfiguracyjnym XML lub wprowadzanych przez użytkownika . Ciekaw jestem, w jaki sposób wywołanie tego stwierdzenia powoduje załadowanie podanego sterownika do środowiska, w którym nie przechowujemy nawet wynikowego obiektu "Class" w dowolnym miejscu. Wpis Javadocs mówi:

public static Class forName(String className) 
       throws ClassNotFoundExceptionReturns 

Zwraca obiekt klasy związane z klasy lub interfejsu o podanej nazwie ciąg

W takim przypadku, w jaki sposób programiści Java udało się ułatwić istnienie obiekt sterownika z tylko tym stwierdzeniem?

+2

Pamiętaj, że 'Class.forName (...)' nie jest już konieczne, jeśli używasz JDBC 4.0 lub nowszego (zawartego w Java SE 6). JDBC może teraz automatycznie znaleźć i zainicjować sterowniki. Zobacz: http://onjava.com/pub/a/onjava/2006/08/02/jjdbc-4-enhancements-in-java-se-6.html – Jesper

+0

Więcej informacji na http://stackoverflow.com/a/8053125/632951 – Pacerier

Odpowiedz

26

Urządzenie Class#forName() uruchamia static initializers (wiesz, static dotyczy klasy, a nie instancji). Implementacja sterownika JDBC should rejestruje się w inicjatorze statycznym.

public class SomeDriver implements Driver { 

    static { 
     DriverManager.registerDriver(new SomeDriver()); 
    } 

} 

Należy pamiętać, że istnieją sterowniki JDBC buggy takie jak org.gjt.mm.mysql.Driver który niepoprawnie rejestruje się wewnątrz konstruktora zamiast. Właśnie dlatego potrzebujesz połączenia newInstance() na takich sterownikach, aby je zarejestrować.

+0

Mam to, proszę pana. Dzięki. Najlepsza odpowiedź do końca :) – mihsathe

+0

Nie ma za co. – BalusC

+0

@BalusC, Dlaczego potrzebujemy użyć Class.forName, aby uruchomić inicjalizator statyczny? Jeśli użyjemy 'SomeDriver' bezpośrednio, np. jeśli mamy już taką instancję, lub nazywamy 'SomeDriver.StaticMethod' bezpośrednio, to czy nie zapewniłoby to już, że inicjator statyczny zostanie wywołany? – Pacerier