Chargement des pilotes JDBC

Haut Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS

1. Introduction

JDBC est un ensemble de spécifications définissant les parties API et SPI du contrat pour Java Database Connectivity. La norme définit l'abstraction du pilote JDBC comme point d'entrée principal pour interagir avec une base de données.

Dans ce didacticiel, nous examinerons certaines des étapes de base nécessaires pour charger les pilotes JDBC.

2. Pilotes JDBC

Pour se connecter à une base de données, nous devons obtenir une instance d'un pilote JDBC.

Nous pouvons l'obtenir via DriverManager en spécifiant la chaîne de connexion URL JDBC. Une telle URL contient le type de moteur de base de données, le nom de la base de données, le nom d'hôte et le port, ainsi que d'autres paramètres de connexion spécifiques au fournisseur de la base de données.

En utilisant la chaîne de connexion, nous pouvons obtenir un objet de connexion à la base de données, qui est l'unité fondamentale de communication avec la base de données dans JDBC :

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

Comment le gestionnaire de pilotes sait-il quel pilote utiliser si la seule indication est l'URL spécifiée?

Il peut y avoir de nombreux pilotes JDBC sur le chemin de classe, il doit donc y avoir un moyen de distinguer chaque pilote de manière unique.

3. Approche héritée

Avant JDBC version 4 et Java SE 1.6, il n'existait pas de mécanisme générique dans la machine virtuelle Java qui permettait de découvrir et d'enregistrer automatiquement les services. Pour cette raison, une étape manuelle était nécessaire pour charger la classe de pilote JDBC par son nom:

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

Le processus de chargement de classe déclenche une routine d'initialisation statique qui enregistre l'instance de pilote auprès de DriverManager et associe cette classe à l'identifiant du moteur de base de données, tel que oracle ou postgres .

Une fois l'enregistrement terminé, nous pouvons utiliser cet identifiant dans l'URL JDBC en tant que jdbc: oracle .

Une routine d'enregistrement de pilote typique instanciera l'instance de pilote et la passera à la méthode 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; } }

L'exemple ci-dessus montre l'enregistrement du pilote JDBC Postgres avec DriverManager . Il est déclenché par la JVM dans le cadre de l'initialiseur statique.

Il est possible d'automatiser partiellement cette étape même avec l'approche héritée en définissant la propriété système jdbc.drivers :

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

Lorsque cette propriété est spécifiée, le gestionnaire de pilotes tente automatiquement de charger le pilote JDBC spécifié.

4. Approche JDBC 4

Le problème de la découverte automatique des services a été résolu avec Java 1.6 et le mécanisme du fournisseur de services . Il permet aux fournisseurs de services de déclarer leurs services en les plaçant sous META-INF / services dans le fichier JAR contenant les services.

Ce mécanisme enregistre automatiquement le pilote afin que l'étape manuelle de chargement de la classe ne soit plus nécessaire. Cependant, même avec le fournisseur de services en place, le chargement manuel des classes ne provoquera pas d'échec. Il est parfaitement légal d'invoquer explicitement le chargement du pilote avec les JVM récents et les pilotes JDBC 4.

La spécification du fournisseur de services remplace simplement le chargement manuel de classe par une approche déclarative. Par exemple, le pilote JDBC PostgreSQL a un seul fichier sous META-INF / services / . Le nom du fichier est java.sql.Driver (qui est une convention bien établie pour les pilotes JDBC). Il contient le nom de classe complet du pilote JDBC, qui, dans ce cas, est org.postgresql.Driver .

5. Conclusion

Dans cet article, nous avons passé en revue les concepts de base autour de JDBC, ainsi que diverses méthodes pour charger les pilotes JDBC, avec une explication de chaque approche.

Comme d'habitude, le code source complet de l'article est disponible à l'adresse over sur GitHub.

Fond Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS