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


¿Cuál será el comando?

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

exactamente hacer durante la conexión a una base de datos Oracle? ¿Hay una manera alternativa de hacer lo mismo?


75
2017-11-08 15:44


origen


Respuestas:


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

No "hace" nada en términos de conectarse a una base de datos, además de garantizar que la clase especificada sea cargada por el cargador de clases actual. 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") llamadas aparecen en legado código que usa JDBC porque eso es el legado forma de cargar un controlador JDBC.

De 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. Este método requiere 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 antes de JDBC 4.0 con el método Class.forName.)

Otras lecturas (léase: preguntas, este es un duplicado de)


54
2017-11-08 15:46



Registra el controlador; 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
}

12
2017-11-08 15:51



Desde el Tutorial 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 antes de 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.


5
2017-11-08 15:50



Pre Java 6 el DriverManager la clase no sabría qué controlador JDBC quería usar. Class.forName("...") fue una forma de precargar las clases de controladores.

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


1
2017-11-08 15:54



Una alternativa sería use la propiedad del sistema jdbc.drivers para especificar sus controladores necesarios en la línea de comando cuando inicia la JVM.


1
2017-11-08 16:00



Este comando carga la clase del controlador jdbc de Oracle para que esté disponible para la instancia de DriverManager. Después de cargar la clase, el sistema puede conectarse a Oracle usándolo. Como alternativa, puede utilizar el método registerDriver de DriverManager y pasarlo con la instancia del controlador JDBC que necesite.


0
2017-11-08 15:48



Utilice oracle.jdbc.OracleDriver, no oracle.jdbc.driver.OracleDriver. No necesita registrarlo si el archivo jar del controlador se encuentra en el directorio "WEB-INF \ lib", si está utilizando Tomcat. Guárdelo como test.jsp y colóquelo en su directorio web, y vuelva a desplegar 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
        }
    }
}

%>

-3
2018-02-26 18:52