Qual è l'effettivo utilizzo di Class.forName ("oracle.jdbc.driver.OracleDriver") durante la connessione a un database?


91

Quale sarà il comando

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

fare esattamente durante la connessione a un database Oracle? C'è un modo alternativo per fare la stessa cosa?


6
Correlato: stackoverflow.com/questions/5992126/loading-jdbc-driver Nota che devi chiamarlo solo una volta , durante l'avvio dell'applicazione; non è necessario chiamarlo ogni volta prima di ottenere una connessione durante il ciclo di vita dell'applicazione.
BalusC

@BalusC Supponiamo di avere i dettagli della mia connessione in una classe separata in Acui chiamo il costruttore della Class.forName("oracle.jdbc.driver.OracleDriver")classe Ae creo un A'soggetto per ottenere il campo di connessione per ogni servlet in cui ho bisogno della connessione, quindi java salterà Class.forName("oracle.jdbc.driver.OracleDriver")o caricherà di nuovo?
Asif Mushtaq

Risposte:


68

Ottiene un riferimento all'oggetto classe con FQCN (nome classe completo) oracle.jdbc.driver.OracleDriver.

Non "fa" nulla in termini di connessione a un database, a parte garantire che la classe specificata sia caricata dal classloader corrente . Non c'è differenza fondamentale tra la scrittura

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

Class.forName("com.example.some.jdbc.driver")le chiamate vengono visualizzate nel codice legacy che utilizza JDBC perché questo è il modo legacy di caricare un driver JDBC .

Dal tutorial Java :

Nelle versioni precedenti di JDBC, per ottenere una connessione, era necessario innanzitutto inizializzare il driver JDBC chiamando il metodo Class.forName. Questo metodo richiedeva un oggetto di tipo java.sql.Driver. Ogni driver JDBC contiene una o più classi che implementano l'interfaccia java.sql.Driver.
...
Tutti i driver JDBC 4.0 che si trovano nel percorso classi vengono caricati automaticamente. (Tuttavia, è necessario caricare manualmente tutti i driver precedenti a JDBC 4.0 con il metodo Class.forName.)

Ulteriore lettura (leggi: domande di cui questa è una duplicazione)


29
In altre parole, ti consente di utilizzare la classe Driver senza avere un'importazione esplicita per la tua classe. Questo ti permette di costruire il progetto senza dover avere il driver Oracle nel tuo classpath.
JustinKSU

3
si noti tuttavia che nel "modo legacy" si chiamerebbe Class.forName()senza catturare il riferimento alla driverClass restituita, quindi a prima vista sembra un'operazione non operativa
matt b

11
Questo perché un driver JDBC dovrebbe avere un inizializzatore statico che registra il driver con DriverManager. Quando si utilizza Class.forName (), questo inizializzatore viene eseguito e il driver viene registrato. A partire da JDBC 4.0, il DriverManager stesso utilizza ServiceLoader per trovare i driver sul classpath.
Mark Rotteveel

1
@ MattBall, Per quanto riguarda la versione precedente a JDBC 4.0, ottenere un riferimento al driver o chiamare una funzione statica di quella classe driver avrebbe già caricato automaticamente la classe driver. Allora perché dobbiamo farlo manualmente Class.forName("etc.driver")?
Pacerier

1
@Pacerier ipotesi errata. JDBC non sa quale driver si desidera caricare, quindi non c'è nulla in JDBC (che è indipendente dal driver) che sappia fare riferimento alla classe driver. Quindi hai bisogno di qualcosa che inneschi un carico di classe. Suppongo che un metodo statico funzionerebbe invece di Class.forName(...).
Matt Ball

13

Registra il conducente; qualcosa della forma:

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

  //etc: implemented methods
}

6

Dal tutorial Java JDBC :

Nelle versioni precedenti di JDBC, per ottenere una connessione, era necessario innanzitutto inizializzare il driver JDBC chiamando il metodo Class.forName. Tutti i driver JDBC 4.0 trovati nel percorso classi vengono caricati automaticamente. (Tuttavia, è necessario caricare manualmente tutti i driver precedenti a JDBC 4.0 con il metodo Class.forName.)

Quindi, se stai utilizzando il driver Oracle 11g (11.1) con Java 1.6, non è necessario chiamare Class.forName. Altrimenti, è necessario chiamarlo per inizializzare il driver.


1
@ Jonathan cosa intendi per "caricare manualmente qualsiasi driver precedente a JDBC 4.0 con il metodo Class.forName" puoi spiegare?
Aravind

La Class.forNamechiamata forza il programma di caricamento classi a caricare la classe data. Questa è la fase di caricamento manuale descritta nel tutorial.
Jonathan

@ Jonathan Ecco perché la mia connessione funziona ancora senza class.forName();:)
Asif Mushtaq

2

Prima di Java 6 la DriverManagerclasse non avrebbe saputo quale driver JDBC si desiderava utilizzare. Class.forName("...")era un modo per precaricare le classi di driver.

Se stai usando Java 6 non è più necessario farlo.


Sì, è necessario utilizzare: OracleDataSource ora docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 e crea l'URL da solo: OracleDataSource finale ds = new OracleDataSource (); ds.setDriverType ("thin"); ds.setServerName (hostName); ds.setPortNumber (porta); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); connessione = ds.getConnection (utente, pwd);
Rajesh Goel

1

Questo comando carica la classe del driver Oracle jdbc da rendere disponibile per l'istanza DriverManager. Dopo che la classe è stata caricata, il sistema può connettersi a Oracle utilizzandola. In alternativa puoi utilizzare il metodo registerDriver di DriverManager e passarlo con l'istanza del driver JDBC di cui hai bisogno.



0

Utilizza oracle.jdbc.OracleDriver, non oracle.jdbc.driver.OracleDriver. Non è necessario registrarlo se il file jar del driver si trova nella directory "WEB-INF \ lib", se si utilizza Tomcat. Salvalo come test.jsp e inseriscilo nella tua directory web e ridistribuisci la cartella della tua app web nel gestore Tomcat:

<%@ 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
        }
    }
}

%>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.