Carga de controladores JDBC

Parte superior de Java

Acabo de anunciar el nuevo curso Learn Spring , centrado en los fundamentos de Spring 5 y Spring Boot 2:

>> VER EL CURSO

1. Introducción

JDBC es un conjunto de especificaciones que definen las partes API y SPI del contrato para la conectividad de bases de datos Java. El estándar define la abstracción del controlador JDBC como el punto de entrada principal para interactuar con una base de datos.

En este tutorial, veremos algunos de los pasos básicos necesarios para cargar controladores JDBC.

2. Controladores JDBC

Para conectarse a una base de datos, debemos obtener una instancia de un controlador JDBC.

Podemos obtenerlo a través del DriverManager especificando la cadena de conexión URL de JDBC. Dicha URL contiene el tipo de motor de base de datos, el nombre de la base de datos, el nombre de host y el puerto, así como otros parámetros de conexión que son específicos del proveedor de la base de datos.

Usando la cadena de conexión, podemos obtener un objeto de conexión de base de datos, que es la unidad fundamental de comunicación con la base de datos en JDBC :

Connection con = DriverManager.getConnection( "jdbc:postgresql://localhost:21500/test?user=fred&password=secret&ssl=true"); 

¿Cómo sabe el administrador de controladores qué controlador utilizar si la única indicación es la URL especificada?

Puede haber muchos controladores JDBC en la ruta de clases, por lo que debe haber una forma de distinguir cada controlador de forma única.

3. Enfoque heredado

Antes de la versión 4 de JDBC y Java SE 1.6, no existía un mecanismo genérico en la JVM que permitiera que los servicios se descubrieran y registraran automáticamente. Por eso, se necesitaba un paso manual para cargar la clase de controlador JDBC por nombre:

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

El proceso de carga de clases desencadena una rutina de inicialización estática que registra la instancia del controlador con DriverManager y asocia esta clase con el identificador del motor de la base de datos, como oracle o postgres .

Una vez que se complete el registro, podemos usar este identificador dentro de la URL de JDBC como jdbc: oracle .

Una rutina típica de registro de controladores creará una instancia de la instancia del controlador y la pasará al método DriverManager.registerDriver :

public static void register() throws SQLException { if (isRegistered()) { throw new IllegalStateException("Driver is already registered. It can only be registered once."); } else { Driver registeredDriver = new Driver(); DriverManager.registerDriver(registeredDriver); Driver.registeredDriver = registeredDriver; } }

El ejemplo anterior muestra el registro del controlador Postgres JDBC con DriverManager . Lo activa la JVM como parte del inicializador estático.

Es posible automatizar parcialmente este paso incluso con el enfoque heredado estableciendo la propiedad del sistema jdbc.drivers :

java -Djdbc.drivers=oracle.jdbc.driver.OracleDriver

Cuando se especifica esta propiedad, el administrador de controladores intentará cargar automáticamente el controlador JDBC especificado.

4. Enfoque JDBC 4

El problema del descubrimiento automático de servicios se resolvió con Java 1.6 y el mecanismo del proveedor de servicios . Permite a los proveedores de servicios declarar sus servicios colocándolos bajo META-INF / services dentro del archivo JAR que contiene los servicios.

Este mecanismo registra el controlador automáticamente para que el paso manual para cargar la clase ya no sea necesario. Sin embargo, incluso con el proveedor de servicios en su lugar, la carga manual de clases no provocará una falla. Es perfectamente legal invocar la carga de controladores explícitamente con controladores JVM y JDBC 4 recientes.

La especificación del proveedor de servicios simplemente reemplaza la carga de clases manual con un enfoque declarativo. Por ejemplo, el controlador JDBC de PostgreSQL tiene un solo archivo en META-INF / services / . El nombre del archivo es java.sql.Driver (que es una convención bien establecida para los controladores JDBC). Contiene el nombre de clase completo del controlador JDBC, que, en este caso, es org.postgresql.Driver .

5. Conclusión

En este artículo, hemos revisado conceptos básicos sobre JDBC, así como varios métodos para cargar controladores JDBC, con una explicación de cada enfoque.

Como de costumbre, el código fuente completo del artículo está disponible en GitHub.

Fondo de Java

Acabo de anunciar el nuevo curso Learn Spring , centrado en los fundamentos de Spring 5 y Spring Boot 2:

>> VER EL CURSO