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

¿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?

preguntado el 08 de noviembre de 11 a las 15:11

Relacionado: stackoverflow.com/questions/5992126/loading-jdbc-driver Tenga en cuenta que debe llamarlo sólo una vez, durante el inicio de su aplicación; no es necesario llamarlo cada vez antes de obtener una conexión durante la vida útil de la aplicación. -

@BalusC Supongamos que tengo mi detalle de conexión en una clase separada A donde llamo Class.forName("oracle.jdbc.driver.OracleDriver") en la clase A constructor, y creo A's objeto para obtener el campo de conexión para cada servlet donde necesito conexión, luego java saltará Class.forName("oracle.jdbc.driver.OracleDriver") o se cargará de nuevo? -

7 Respuestas

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, además de asegurarse de 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 legado código que usa JDBC porque eso es el legado forma 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.)

Otras lecturas (lea: preguntas de las que este es un duplicado)

Respondido el 20 de junio de 20 a las 12:06

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

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 sin operación - mate b

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

@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 hacer manualmente Class.forName("etc.driver") ? - Pacerier

@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. Así que tú necesitas algo que desencadena una carga de clase. Supongo que un método estático funcionaría en lugar de Class.forName(...). - Matt Ball

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
}

respondido 08 nov., 11:19

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.

respondido 08 nov., 11:19

@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.forName call obliga al cargador de clases a cargar la clase dada. Este es el paso de carga manual descrito en el tutorial. - Jonathan

@Jonathan Por eso mi conexión sigue funcionando sin class.forName(); :) - Asif Mushtaq

Pre Java 6 el DriverManager class 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.

respondido 08 nov., 11:19

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

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.

respondido 08 nov., 11:19

Una alternativa sería usar la propiedad del sistema jdbc.drivers para especificar los controladores necesarios en la línea de comandos cuando inicia la JVM.

respondido 08 nov., 11:20

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

%>

Respondido 26 Feb 13, 22:02

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.