Indlæser JDBC-drivere

Java Top

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN

1. Introduktion

JDBC er et sæt specifikationer, der definerer API- og SPI-dele i kontrakten til Java Database Connectivity. Standarden definerer JDBC-driverabstraktionen som det primære indgangspunkt for interaktion med en database.

I denne vejledning ser vi på nogle af de grundlæggende trin, der er nødvendige for at indlæse JDBC-drivere.

2. JDBC-drivere

For at oprette forbindelse til en database skal vi få en forekomst af en JDBC-driver.

Vi kan få det gennem DriverManager ved at specificere JDBC URL-forbindelsesstrengen. En sådan URL indeholder typen af ​​databasemotor, databasenavn, værtsnavn og port samt andre forbindelsesparametre, der er specifikke for databaseleverandøren.

Ved hjælp af forbindelsesstrengen kan vi få et databaseforbindelsesobjekt, som er den grundlæggende enhed for kommunikation med databasen i JDBC:

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

Hvordan ved driveradministratoren, hvilken driver der skal bruges, hvis den eneste angivelse er den angivne URL?

Der kan være mange JDBC-drivere på klassestien, så der skal være en måde at skelne hver chauffør entydigt ud.

3. Legacy tilgang

Før JDBC version 4 og Java SE 1.6 var der ingen generisk mekanisme i JVM, der gjorde det muligt at opdage og registrere tjenester automatisk. På grund af dette var det nødvendigt med et manuelt trin for at indlæse JDBC-førerklassen ved navn:

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

Klasseindlæsningsprocessen udløser en statisk initialiseringsrutine, der registrerer driverinstansen med DriverManager og forbinder denne klasse med databasemotoridentifikatoren, såsom orakel eller postgres.

Når registreringen er afsluttet, kan vi bruge denne identifikator inde i JDBC URL som jdbc: orakel.

En typisk driverregistreringsrutine vil instantere driverinstansen og videregive den til DriverManager.registerDriver metode:

offentligt statisk ugyldigt register () kaster SQLException {if (isRegistered ()) {throw new IllegalStateException ("Driver er allerede registreret. Det kan kun registreres en gang."); } ellers {Driver registeredDriver = ny driver (); DriverManager.registerDriver (registeredDriver); Driver.registeredDriver = registeredDriver; }}

Eksemplet ovenfor viser Postgres JDBC-driverregistrering med DriverManager. Det udløses af JVM som en del af den statiske initialisering.

Det er muligt delvist at automatisere dette trin selv med den ældre tilgang ved at indstille jdbc.drivers systemegenskab:

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

Når denne egenskab er specificeret, forsøger driveradministratoren automatisk at indlæse den angivne JDBC-driver.

4. JDBC 4-tilgang

Problemet med automatisk opdagelse af tjenester blev løst med Java 1.6 og tjenesteudbydermekanismen. Det gør det muligt for tjenesteudbydere at erklære deres tjenester ved at placere dem under META-INF / tjenester inde i JAR-filen, der indeholder tjenesterne.

Denne mekanisme registrerer driveren automatisk, så det manuelle trin til at indlæse klassen ikke længere er nødvendigt. Selv med tjenesteudbyderen på plads vil manuel klasseindlæsning imidlertid ikke forårsage en fejl. Det er helt lovligt at påberåbe sig indlæsning af drivere eksplicit med nylige JVM'er og JDBC 4-drivere.

Tjenesteudbyderens specifikation erstatter simpelthen manuel klasselæsning med en deklarativ tilgang. For eksempel har PostgreSQL JDBC-driveren en enkelt fil under META-INF / tjenester /. Filnavnet er java.sql.Driver (som er en veletableret konvention for JDBC-drivere). Den indeholder det fuldt kvalificerede klassenavn på JDBC-driveren, som i dette tilfælde er org.postgresql.Driver.

5. Konklusion

I denne artikel har vi gennemgået grundlæggende begreber omkring JDBC samt forskellige metoder til at indlæse JDBC-drivere med en forklaring på hver tilgang.

Som sædvanlig er den komplette kildekode til artiklen tilgængelig på GitHub.

Java bund

Jeg har lige annonceret det nye Lær foråret kursus med fokus på det grundlæggende i Spring 5 og Spring Boot 2:

>> KONTROLLER KURSEN