Frage Was ist die tatsächliche Verwendung von Class.forName ("oracle.jdbc.driver.OracleDriver") während der Verbindung mit einer Datenbank?


Was wird der Befehl?

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

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


75
2017-11-08 15:44


Ursprung


Antworten:


Es erhält eine Referenz auf das Klassenobjekt mit dem FQCN (vollqualifizierter Klassenname) oracle.jdbc.driver.OracleDriver.

Es "tut" nichts in Bezug auf die Verbindung zu einer Datenbank, Stellen Sie außerdem sicher, dass die angegebene Klasse vom aktuellen Classloader geladen wird. Es gibt keinen grundlegenden 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") Anrufe erscheinen in Erbe Code, der JDBC verwendet, weil das ist das Erbe Möglichkeit, einen JDBC-Treiber zu laden.

Von Das Java-Tutorial:

In früheren Versionen von JDBC musste der JDBC-Treiber zuerst durch Aufrufen der Methode initialisiert werden, um eine Verbindung zu erhalten Class.forName. Diese Methoden erforderten 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 in Ihrem Klassenpfad gefunden werden, werden automatisch geladen. (Sie müssen jedoch alle Treiber vor JDBC 4.0 manuell mit der Methode laden Class.forName.)

Weiterführende Literatur (Lies: Fragen, das ist eine Dupe)


54
2017-11-08 15:46



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
}

12
2017-11-08 15:51



Von dem Java-JDBC-Lernprogramm:

In früheren Versionen von JDBC musste der JDBC-Treiber zuerst durch Aufrufen der Methode initialisiert werden, um eine Verbindung zu erhalten Class.forName.   Alle JDBC 4.0-Treiber, die in Ihrem Klassenpfad gefunden werden, werden automatisch geladen. (Sie müssen jedoch alle Treiber vor JDBC 4.0 manuell mit der Methode laden Class.forName.)

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


5
2017-11-08 15:50



Vor Java 6 der DriverManager Klasse hätte nicht gewusst, welchen JDBC-Treiber Sie verwenden wollten. Class.forName("...") war eine Möglichkeit, die Treiberklassen vorzuladen.

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


1
2017-11-08 15:54



Eine Alternative wäre Verwenden Sie die Systemeigenschaft jdbc.drivers um beim Starten der JVM die erforderlichen Treiber in der Befehlszeile anzugeben.


1
2017-11-08 16:00



Dieser Befehl lädt die Klasse des Oracle jdbc-Treibers für die DriverManager-Instanz. Nachdem die Klasse geladen wurde, kann sich das System mit Oracle verbinden. Als Alternative können Sie die registerDriver-Methode des DriverManager verwenden und sie mit der benötigten Instanz des JDBC-Treibers übergeben.


0
2017-11-08 15:48



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 und 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
        }
    }
}

%>

-3
2018-02-26 18:52