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
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)
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:
publicclassSomeDriverimplementsDriver{static{try{DriverManager.registerDriver(newSomeDriver());}catch(SQLException e){// TODO Auto-generated catch block}}//etc: implemented methods}
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.
@ 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.
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.
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:
A
in der ich denClass.forName("oracle.jdbc.driver.OracleDriver")
Klassenkonstruktor aufrufeA
, und ich erstelle einA's
Objekt, um das Verbindungsfeld für jedes Servlet abzurufen, für das ich eine Verbindung benötige. Dann wird Java überspringenClass.forName("oracle.jdbc.driver.OracleDriver")
oder erneut geladen.Antworten:
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.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 :
Weiterführende Literatur (lesen Sie: Fragen, von denen dies ein Dup ist)
quelle
Class.forName()
ohne den Verweis auf die zurückgegebene driverClass zu erfassen, so dass es auf den ersten Blick wie eine No-Op-Operation erscheintClass.forName("etc.driver")
?Class.forName(...)
.Es registriert den Fahrer; etwas von der Form:
quelle
Aus dem Java JDBC-Tutorial :
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.quelle
Class.forName
Aufruf zwingt den Klassenladeprogramm, die angegebene Klasse zu laden. Dies ist der im Lernprogramm beschriebene manuelle Ladeschritt.class.forName();
:)Vor Java 6 hätte die
DriverManager
Klasse 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.
quelle
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.
quelle
Eine Alternative wäre die Verwendung der Systemeigenschaft jdbc.drivers , um die erforderlichen Treiber in der Befehlszeile anzugeben, wenn Sie die JVM starten.
quelle
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:
quelle