example - jdbc java descargar
¿Cuál es el propósito de ''Class.forName(“MY_JDBC_DRIVER”)''? (4)
En muchas aplicaciones industriales, nos gustaría abstraer la capa de acceso a datos del resto del código, extrayendo dicha información en forma de un archivo de propiedades / archivo de configuración. En esos casos, podríamos necesitar usar algo como usted lo ha 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 desea utilizar como base de datos (por ejemplo, controlador ojdbc o controlador mysql jdbc, etc.) En los casos se puede cargar la clase utilizando dicho método.
Entiendo que la carga de clases es útil para cargar la clase en tiempo de ejecución con su nombre de clase.
Sin embargo, mientras usamos JDBC en nuestro proyecto, sabemos qué controlador vamos a usar 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 seguir agregando el controlador en la ruta de clase? Ya que sabemos qué driver vamos a usar.
Creo que Class.forName(JDBC_DRIVER)
cargará el controlador en DriverManager
. ¿Es la única razón?
Edición 1:
La documentación de la API DriverManager
establece que
Como parte de su inicialización (DriverManager), la clase DriverManager intentará cargar las clases de controladores a las que se hace referencia en la propiedad del sistema "jdbc.drivers".
Las aplicaciones ya no necesitan cargar explícitamente los controladores JDBC utilizando
Class.forName()
. Los programas existentes que actualmente cargan controladores JDBC utilizandoClass.forName()
continuarán funcionando sin modificaciones.
Entonces cuando uso otro que no sea el controlador oracle; ¿Debo cambiar la cadena del nombre del controlador en la propiedad del sistema?
La llamada Class.forName (JDBC_DRIVER) registrará su controlador JDBC en el DriverManager, por lo que puede resolverlo por url, como "jdbc: odbc: Database" y así sucesivamente ...
Normalmente, la clase del 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 tienes que poner el controlador JDBC en el classpath.
Como alternativa, puede utilizar DataSource específico de la base de datos, luego puede especificar de forma declarativa el tipo de fuente de datos, por ejemplo, en el contexto de Spring o en su servidor web JNDI. Aquí hay un example .
Poner una clase en la ruta de clase no es suficiente para que el cargador de clases la cargue. Y la clase de controlador debe cargarse para garantizar que está registrada en la API de JDBC. Por cierto, para que funcione Class.forName
, la clase del controlador debe estar en la ruta de clase.
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 controladores JDBC ahora se encuentran utilizando el mecanismo del proveedor de servicios . Debería poder simplemente eliminar esa llamada y dejar el resto del código sin cambios y debería continuar 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 el DriverManager
mediante registerDriver
. Este método se suele llamar desde el bloque de inicialización estático de la clase de controlador real, que se activa cuando la clase se carga por primera vez, por lo que la emisión de Class.forName()
garantiza que el controlador se registre a sí mismo (si aún no lo ha hecho).
Y no importa si usa Class.forName()
o el nuevo mecanismo de proveedor de servicios, siempre necesitará el controlador JDBC en el 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 garantizar que el controlador esté registrado. Si usa un JDK actual y los controladores JDBC actuales, entonces esta llamada ya no debería ser necesaria.