¿Cuál es el uso real de Class.forName (“oracle.jdbc.driver.OracleDriver”) mientras se conecta a una base de datos?

91

¿Qué será el comando

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

exactamente mientras se conecta a una base de datos de Oracle? ¿Existe una forma alternativa de hacer lo mismo?

Aravind
fuente
6
Relacionado: stackoverflow.com/questions/5992126/loading-jdbc-driver Tenga en cuenta que debe llamarlo solo una vez , durante el inicio de la aplicación; no es necesario llamarlo cada vez antes de obtener una conexión durante la vida útil de la aplicación.
BalusC
@BalusC Supongamos que tengo los detalles de mi conexión en una clase separada Adonde llamo Class.forName("oracle.jdbc.driver.OracleDriver")al Aconstructor de la clase , y creo un A'sobjeto para obtener el campo de conexión para cada servlet donde necesito conexión, entonces java saltará Class.forName("oracle.jdbc.driver.OracleDriver")o se cargará nuevamente.
Asif Mushtaq

Respuestas:

68

Obtiene una referencia al objeto de clase con el FQCN (nombre de clase totalmente calificado) oracle.jdbc.driver.OracleDriver.

No "hace" nada en términos de conectarse a una base de datos, aparte de garantizar que el cargador de clases actual cargue la clase especificada . No hay diferencia fundamental entre escribir

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

Class.forName("com.example.some.jdbc.driver")las llamadas aparecen en código heredado que usa JDBC porque esa es la forma heredada de cargar un controlador JDBC .

Desde el tutorial de Java :

En versiones anteriores de JDBC, para obtener una conexión, primero tenía que inicializar su controlador JDBC llamando al método Class.forName. Estos métodos requieren un objeto de tipo java.sql.Driver. Cada controlador JDBC contiene una o más clases que implementan la interfaz java.sql.Driver.
...
Todos los controladores JDBC 4.0 que se encuentran en su ruta de clases se cargan automáticamente. (Sin embargo, debe cargar manualmente cualquier controlador anterior a JDBC 4.0 con el método Class.forName).

Lectura adicional (lea: preguntas de las que este es un duplicado)

Matt Ball
fuente
29
En otras palabras, le permite usar la clase Driver sin tener una importación explícita para su clase. Esto le permite construir el proyecto sin tener que tener el controlador de Oracle en su classpath.
JustinKSU
3
Sin embargo, debe tener en cuenta que, en la "forma heredada", llamaría Class.forName()sin capturar la referencia al driverClass devuelto, por lo que a primera vista parece una operación no operativa
matt b
11
Esto se debe a que un controlador JDBC debe tener un inicializador estático que registre el controlador con DriverManager. Cuando se usa Class.forName (), este inicializador se ejecuta y el controlador se registra. Desde JDBC 4.0, el propio DriverManager usa ServiceLoader para encontrar controladores en la ruta de clases.
Mark Rotteveel
1
@MattBall, con respecto a la versión anterior a JDBC 4.0, obtener una referencia al controlador o llamar a una función estática de esa clase de controlador ya cargaría automáticamente la clase de controlador. Entonces, ¿por qué tenemos que hacerlo manualmente Class.forName("etc.driver")?
Pacerier
1
@Pacerier suposición incorrecta. JDBC no sabe qué controlador desea cargar, por lo que no hay nada en JDBC (que es independiente del controlador) que sepa hacer referencia a la clase de controlador. Entonces necesitas algo que active una carga de clase. Supongo que un método estático funcionaría en lugar de Class.forName(...).
Matt Ball
13

Registra al conductor; algo de la forma:

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

  //etc: implemented methods
}
McDowell
fuente
6

Desde el tutorial de Java JDBC :

En versiones anteriores de JDBC, para obtener una conexión, primero tenía que inicializar su controlador JDBC llamando al método Class.forName. Todos los controladores JDBC 4.0 que se encuentran en su ruta de clases se cargan automáticamente. (Sin embargo, debe cargar manualmente cualquier controlador anterior a JDBC 4.0 con el método Class.forName).

Por lo tanto, si está utilizando el controlador Oracle 11g (11.1) con Java 1.6, no necesita llamar Class.forName. De lo contrario, debe llamarlo para inicializar el controlador.

Jonathan
fuente
1
@Jonathan¿Qué quiere decir con "cargar manualmente cualquier controlador anterior a JDBC 4.0 con el método Class.forName", puede explicarlo?
Aravind
La Class.forNamellamada obliga al cargador de clases a cargar la clase dada. Este es el paso de carga manual descrito en el tutorial.
Jonathan
@Jonathan Así que es por eso que mi conexión sigue funcionando sin class.forName();:)
Asif Mushtaq
2

Antes de Java 6, la DriverManagerclase no habría sabido qué controlador JDBC quería usar. Class.forName("...")era una forma de precargar las clases de controladores.

Si está utilizando Java 6, ya no necesita hacer esto.

Qwerky
fuente
Sí, es necesario usar: OracleDataSource ahora docs.oracle.com/cd/B28359_01/java.111/b31224/urls.htm#i1070726 y crea la URL por sí sola: final OracleDataSource ds = new OracleDataSource (); ds.setDriverType ("delgado"); ds.setServerName (nombre de host); ds.setPortNumber (puerto); //ds.setDatabaseName(dbName); ds.setServiceName (dbName); conexión = ds.getConnection (usuario, pwd);
Rajesh Goel
1

Este comando carga la clase del controlador jdbc de Oracle para que esté disponible para la instancia de DriverManager. Una vez cargada la clase, el sistema puede conectarse a Oracle usándola. Como alternativa, puede usar el método registerDriver de DriverManager y pasarlo con la instancia del controlador JDBC que necesita.

anatolich
fuente
0

Utilice oracle.jdbc.OracleDriver, no oracle.jdbc.driver.OracleDriver. No es necesario que lo registre si el archivo jar del controlador está en el directorio "WEB-INF \ lib", si está utilizando Tomcat. Guarde esto como test.jsp y colóquelo en su directorio web, y vuelva a implementar la carpeta de su aplicación web en el administrador de 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
        }
    }
}

%>
Tom
fuente