¿Cuál es el propósito de ‘Class.forName (“MY_JDBC_DRIVER”)’?

Entiendo que la carga de clase es útil para cargar la clase en tiempo de ejecución con su nombre de clase.

Sin embargo, al utilizar JDBC en nuestro proyecto, sabemos qué controlador vamos a utilizar y, en su mayoría, la cadena del administrador de controladores está codificada.

Mi pregunta es: ¿por qué estamos cargando el controlador usando Class.forName("JDBC_DRIVER") aquí?
¿Por qué no podemos continuar agregando el controlador en la ruta de clase? ya que sabemos qué contenedor de controladores vamos a usar.

Creo que Class.forName(JDBC_DRIVER) cargará el controlador en DriverManager . ¿Es la única razón?

Editar 1:

El documento API de DriverManager afirma que

Como parte de su inicialización (DriverManager), la clase DriverManager intentará cargar las clases de controlador a las que se hace referencia en la propiedad del sistema “jdbc.drivers”.

Las aplicaciones ya no necesitan cargar explícitamente los controladores JDBC usando Class.forName() . Los progtwigs existentes que actualmente cargan controladores JDBC utilizando Class.forName() continuarán funcionando sin modificaciones.

Entonces cuando uso otro que no sea el controlador oracle; ¿Necesito cambiar la cadena del nombre del controlador en la propiedad del sistema?

Primero: con los controladores JDBC modernos y un JDK actual (al menos Java 6) la llamada a Class.forName() ya no es necesaria. Las clases de controlador JDBC ahora se encuentran utilizando el mecanismo del proveedor de servicios . Debería poder simplemente eliminar esa llamada y dejar el rest del código sin cambios y debería seguir funcionando.

Si no está utilizando un JDK actual (o si tiene un controlador JDBC que no tiene los archivos adecuados configurados para usar ese mecanismo), entonces el controlador debe registrarse con DriverManager utilizando registerDriver . Ese método generalmente se llama desde el bloque de inicializador estático de la clase de controlador real, que se activa cuando la clase se carga por primera vez, por lo que emitir Class.forName() garantiza que el controlador se registre solo (si no lo hizo).

Y no importa si usa Class.forName() o el nuevo mecanismo de proveedor de servicios, siempre necesitará el controlador JDBC en classpath (o disponible a través de algún ClassLoader en tiempo de ejecución, al menos).

tl; dr : sí, el único uso de esa llamada Class.forName() es asegurar que el controlador esté registrado. Si utiliza un JDK actual y controladores JDBC actuales, entonces esta llamada ya no será necesaria.

La llamada Class.forName (JDBC_DRIVER) registrará su controlador JDBC en el DriverManager, por lo que puede abordarlo por url, como “jdbc: odbc: Database” y así sucesivamente …

Por lo general, la clase de controlador tiene un código de inicialización estático como este, que se invoca en Class.forName ():

  public class Driver implements java.sql.Driver { static { try { DriverManager.registerDriver(new Driver()); } catch (SQLException E) { throw new RuntimeException("Can't register driver!"); } } } 

Todavía tiene que poner el contenedor JDBC en el classpath.

Como alternativa, puede usar el DataSource específico de la base de datos, luego puede especificar declarativamente el tipo de fuente de datos, por ejemplo en el contexto de Spring o en su JNDI de servidor web. Aquí hay un ejemplo .

Poner una clase en el classpath no es suficiente para que el cargador de clases lo cargue. Y la clase de controlador debe cargarse para garantizar que esté registrada en la API de JDBC. Por cierto, para que Class.forName funcione, la clase de controlador debe estar en la ruta de clases.

En muchas aplicaciones industriales, nos gustaría abstraer la capa de acceso a los datos del rest del código, tirando de dicha información en forma de un archivo de propiedad / archivo de configuración. En esos casos, podríamos necesitar usar algo como lo has hecho.

Por ejemplo, podemos usar las clases de interfaz JDBC para escribir el código para acceder a la base de datos, donde puede configurar las propiedades seleccionando qué tecnología quiere usar como base de datos (por ejemplo, controlador ojdbc, o controlador mysql jdbc, etc.) en aquellos En los casos puedes cargar la clase usando dicho método.