Was ist der Zweck von ‘Class.forName (“MY_JDBC_DRIVER”)?

Ich verstehe, dass das Laden von classn nützlich ist, um die class zur Laufzeit mit ihrem classnnamen zu laden.

Bei der Verwendung von JDBC in unserem Projekt wissen wir jedoch, welchen Treiber wir verwenden werden, und meistens ist die Treiber-Manager-Zeichenfolge fest codiert.

Meine Frage ist: Warum laden wir hier Treiber mit Class.forName("JDBC_DRIVER") ?
Warum können wir den Treiber nicht im classnpfad hinzufügen? da wir wissen, welches Treiberglas wir verwenden werden.

Ich glaube Class.forName(JDBC_DRIVER) lädt den Treiber in DriverManager . Ist es der einzige Grund?

Bearbeiten 1:

Das DriverManager API doc besagt das

Im Rahmen der Initialisierung (DriverManager) versucht die DriverManager-class, die in der Systemeigenschaft “jdbc.drivers” referenzierten Treiberklassen zu laden.

Anwendungen müssen JDBC-Treiber nicht mehr explizit mithilfe von Class.forName() laden. Vorhandene Programme, die derzeit JDBC-Treiber mit Class.forName() laden, Class.forName() weiterhin ohne Änderungen.

Dann, wenn ich andere als oracletreiber verwende; Muss ich die Zeichenfolge des Treibernamens in der Systemeigenschaft ändern?

Erstens: Mit modernen JDBC-Treibern und einem aktuellen JDK (mindestens Java 6) ist der Aufruf von Class.forName() nicht mehr notwendig. JDBC-Treiberklassen werden jetzt mithilfe des Dienstanbietermechanismus gefunden . Sie sollten in der Lage sein, diesen Anruf einfach zu entfernen und den Rest des Codes unverändert zu lassen, und er sollte weiterhin funktionieren.

Wenn Sie kein aktuelles JDK verwenden (oder wenn Sie einen JDBC-Treiber haben, der nicht über die geeigneten Dateien zur Verwendung dieses Mechanismus verfügt), muss der Treiber mit dem DriverManager Verwendung von registerDriver . Diese Methode wird normalerweise aus dem statischen Initialisiererblock der tatsächlichen Treiberklasse aufgerufen, der beim ersten Laden der class ausgetriggers wird. Durch die Ausgabe von Class.forName() sichergestellt, dass sich der Treiber selbst registriert (falls dies nicht bereits geschehen ist).

Und egal, ob Sie Class.forName() oder den neuen Service-Provider-Mechanismus verwenden, Sie benötigen immer den JDBC-Treiber für den classnpfad (oder zumindest über einen ClassLoader zur Laufzeit verfügbar).

tl; dr : Ja, die einzige Verwendung dieses Class.forName() von Class.forName() besteht darin, sicherzustellen, dass der Treiber registriert ist. Wenn Sie ein aktuelles JDK und aktuelle JDBC-Treiber verwenden, sollte dieser Aufruf nicht mehr erforderlich sein.

Der Aufruf Class.forName (JDBC_DRIVER) registriert Ihren JDBC-Treiber im DriverManager, sodass Sie ihn per URL adressieren können, z. B. “jdbc: odbc: Database” usw.

Normalerweise hat die Treiberklasse einen statischen Initialisierungscode wie diesen, der auf Class.forName () aufgerufen wird:

  public class Driver implements java.sql.Driver { static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } } 

Sie müssen JDBC-Treiber jar immer noch in den classnpfad einfügen.

Alternativ können Sie datenbankspezifische DataSource verwenden. Dann können Sie den Datenquellentyp deklarativ angeben, z. B. im Spring-Kontext oder in Ihrem Web-Server-JNDI. Hier ist ein Beispiel .

Das Einfügen einer class in den classnpfad reicht nicht aus, um sie vom classnladeprogramm laden zu lassen. Und die Treiberklasse muss geladen werden, um sicherzustellen, dass sie für die JDBC-API registriert ist. BTW, damit Class.forName funktioniert, muss die Treiberklasse im classnpfad sein.

In vielen industriellen Anwendungen möchten wir die Datenzugriffsebene vom restlichen Code abstrahieren, indem wir solche Informationen in Form einer Eigenschaftendatei / Konfigurationsdatei abrufen. In diesen Fällen müssen wir möglicherweise etwas verwenden, wie Sie es getan haben.

Beispielsweise können wir die JDBC-Schnittstellenklassen verwenden, um den Code für den Zugriff auf die database zu schreiben. Dort können Sie die Eigenschaften konfigurieren, indem Sie auswählen, welche Technologie Sie als database verwenden möchten (z. B. ojdbc-Treiber oder mysql jdbc-Treiber) Fälle können Sie die class mit einer solchen Methode laden.