Was ist die tatsächliche Verwendung von Class.forName ("oracle.jdbc.driver.OracleDriver") beim Herstellen einer Verbindung zu einer Datenbank?

91

Was wird der Befehl

Class.forName("oracle.jdbc.driver.OracleDriver")

genau tun, während Sie eine Verbindung zu einer Oracle-Datenbank herstellen? Gibt es eine alternative Möglichkeit, dasselbe zu tun?

Aravind
quelle
6
Verwandte Themen : stackoverflow.com/questions/5992126/loading-jdbc-driver Beachten Sie, dass Sie es beim Start Ihrer Anwendung nur einmal aufrufen müssen . Sie müssen es nicht jedes Mal aufrufen, bevor Sie während der Lebensdauer der Anwendung eine Verbindung herstellen.
BalusC
@BalusC Angenommen, ich habe meine Verbindungsdetails in einer separaten Klasse, Ain der ich den Class.forName("oracle.jdbc.driver.OracleDriver")Klassenkonstruktor aufrufe A, und ich erstelle ein A'sObjekt, um das Verbindungsfeld für jedes Servlet abzurufen, für das ich eine Verbindung benötige. Dann wird Java überspringen Class.forName("oracle.jdbc.driver.OracleDriver")oder erneut geladen.
Asif Mushtaq

Antworten:

68

Es erhält einen Verweis auf das Klassenobjekt mit dem FQCN (vollständig qualifizierter Klassenname) oracle.jdbc.driver.OracleDriver.

Es "tut" nichts in Bezug auf die Verbindung zu einer Datenbank, außer sicherzustellen, dass die angegebene Klasse vom aktuellen Klassenladeprogramm geladen wird . Es gibt keinen grundsätzlichen Unterschied zwischen dem Schreiben

Class<?> driverClass = Class.forName("oracle.jdbc.driver.OracleDriver");
// and
Class<?> stringClass = Class.forName("java.lang.String");

Class.forName("com.example.some.jdbc.driver")Aufrufe werden in Legacy- Code angezeigt, der JDBC verwendet, da dies die Legacy- Methode zum Laden eines JDBC-Treibers ist .

Aus dem Java-Tutorial :

In früheren Versionen von JDBC mussten Sie zunächst Ihren JDBC-Treiber durch Aufrufen der Methode initialisieren, um eine Verbindung herzustellen Class.forName. Diese Methode erforderte ein Objekt vom Typ java.sql.Driver. Jeder JDBC-Treiber enthält eine oder mehrere Klassen, die die Schnittstelle implementieren java.sql.Driver.
...
Alle JDBC 4.0-Treiber, die sich in Ihrem Klassenpfad befinden, werden automatisch geladen. (Sie müssen jedoch alle Treiber vor JDBC 4.0 mit der Methode manuell laden Class.forName.)

Weiterführende Literatur (lesen Sie: Fragen, von denen dies ein Dup ist)

Matt Ball
quelle
28
Mit anderen Worten, Sie können die Driver-Klasse verwenden, ohne einen expliziten Import für Ihre Klasse zu haben. Auf diese Weise können Sie das Projekt erstellen, ohne den Oracle-Treiber in Ihrem Klassenpfad haben zu müssen.
JustinKSU
3
sollte jedoch beachten, dass Sie auf die "Legacy-Art" anrufen würden, Class.forName()ohne den Verweis auf die zurückgegebene driverClass zu erfassen, so dass es auf den ersten Blick wie eine No-Op-Operation erscheint
matt b
11
Dies liegt daran, dass ein JDBC-Treiber über einen statischen Initialisierer verfügen sollte, der den Treiber beim DriverManager registriert. Bei Verwendung von Class.forName () wird dieser Initialisierer ausgeführt und der Treiber registriert. Seit JDBC 4.0 verwendet der DriverManager selbst ServiceLoader, um Treiber im Klassenpfad zu finden.
Mark Rotteveel
1
@MattBall, In Bezug auf Pre-JDBC 4.0 würde das Abrufen eines Verweises auf den Treiber oder das Aufrufen einer statischen Funktion dieser Treiberklasse die Treiberklasse bereits automatisch laden. Warum müssen wir das also manuell tun Class.forName("etc.driver")?
Pacerier
1
@ Pacerier falsche Annahme. JDBC weiß nicht, welchen Treiber Sie laden möchten, daher gibt es in JDBC (das treiberunabhängig ist) nichts, was sich auf die Treiberklasse beziehen könnte. Sie benötigen also etwas, das eine Klassenlast auslöst. Ich nehme an, dass stattdessen eine statische Methode funktionieren würde Class.forName(...).
Matt Ball
13

Es registriert den Fahrer; etwas von der Form:

public class SomeDriver implements Driver {
  static {
    try {
      DriverManager.registerDriver(new SomeDriver());
    } catch (SQLException e) {
      // TODO Auto-generated catch block
    }
  }

  //etc: implemented methods
}
McDowell
quelle
6

Aus dem Java JDBC-Tutorial :

In früheren Versionen von JDBC mussten Sie zunächst Ihren JDBC-Treiber durch Aufrufen der Methode initialisieren, um eine Verbindung herzustellen Class.forName. Alle JDBC 4.0-Treiber, die sich in Ihrem Klassenpfad befinden, werden automatisch geladen. (Sie müssen jedoch alle Treiber vor JDBC 4.0 mit der Methode manuell laden Class.forName.)

Wenn Sie also den Oracle 11g (11.1) -Treiber mit Java 1.6 verwenden, müssen Sie nicht aufrufen Class.forName. Andernfalls müssen Sie es aufrufen, um den Treiber zu initialisieren.

Jonathan
quelle
1
@ JonathanWas meinst du mit "Treiber vor JDBC 4.0 manuell mit der Methode Class.forName laden", kannst du das bitte erklären?
Aravind
Der Class.forNameAufruf zwingt den Klassenladeprogramm, die angegebene Klasse zu laden. Dies ist der im Lernprogramm beschriebene manuelle Ladeschritt.
Jonathan
@ Jonathan Deshalb ist meine Verbindung immer noch ohne class.forName();:)
Asif Mushtaq
2

Vor Java 6 hätte die DriverManagerKlasse nicht gewusst, welchen JDBC-Treiber Sie verwenden wollten. Class.forName("...")war ein Weg zum Vorladen der Treiberklassen.

Wenn Sie Java 6 verwenden, müssen Sie dies nicht mehr tun.

Qwerky
quelle
Ja, man muss Folgendes verwenden: OracleDataSource jetzt docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 und die URL wird selbst erstellt: final OracleDataSource ds = new OracleDataSource (); ds.setDriverType ("thin"); ds.setServerName (Hostname); ds.setPortNumber (Port); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); connection = ds.getConnection (Benutzer, pwd);
Rajesh Goel
1

Dieser Befehl lädt die Klasse des Oracle JDBC-Treibers, damit sie für die DriverManager-Instanz verfügbar ist. Nach dem Laden der Klasse kann das System eine Verbindung zu Oracle herstellen. Alternativ können Sie die registerDriver-Methode von DriverManager verwenden und sie mit der benötigten Instanz des JDBC-Treibers übergeben.

Anatolich
quelle
0

Verwenden Sie oracle.jdbc.OracleDriver, nicht oracle.jdbc.driver.OracleDriver. Sie müssen es nicht registrieren, wenn sich die Treiber-JAR-Datei im Verzeichnis "WEB-INF \ lib" befindet, wenn Sie Tomcat verwenden. Speichern Sie diese Datei als test.jsp, legen Sie sie in Ihrem Webverzeichnis ab und stellen Sie Ihren Web-App-Ordner im Tomcat-Manager erneut bereit:

<%@ page import="java.sql.*" %>

<HTML>
<HEAD>
<TITLE>Simple JSP Oracle Test</TITLE>
</HEAD><BODY>
<%
Connection conn = null;
try {
    Class.forName("oracle.jdbc.OracleDriver");
    conn = DriverManager.getConnection("jdbc:oracle:thin:@XXX.XXX.XXX.XXX:XXXX:dbName", "user", "password");
    Statement stmt = conn.createStatement();
    out.println("Connection established!");
}
catch (Exception ex)
{
    out.println("Exception: " + ex.getMessage() + "");

}
finally
{
    if (conn != null) {
        try {
            conn.close();   
        }
        catch (Exception ignored) {
            // ignore
        }
    }
}

%>
Tom
quelle