Java >> Java tutorial >  >> Tag >> Jdbc

Indlæser JDBC-drivere

1. Introduktion

JDBC er et sæt specifikationer, der definerer API- og SPI-delene af kontrakten for Java Database Connectivity. Standarden definerer JDBC-driverabstraktionen som det primære indgangspunkt for at interagere med en database.

I denne øvelse tager vi et kig 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 angive 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 at bruge forbindelsesstrengen kan vi opnå et databaseforbindelsesobjekt, som er den grundlæggende enhed for kommunikation med databasen i JDBC :

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

Hvordan ved drivermanageren, hvilken driver der skal bruges, hvis den eneste indikation er den angivne URL?

Der kan være mange JDBC-drivere på klassestien, så der skal være en måde at adskille hver driver unikt.

3. Ældre tilgang

Før JDBC version 4 og Java SE 1.6 var der ingen generisk mekanisme i JVM'et, der ville gøre det muligt at opdage og registrere tjenester automatisk. På grund af det var et manuelt trin nødvendigt for at indlæse JDBC-driverklassen efter navn:

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

Klasseindlæsningsprocessen udløser en statisk initialiseringsrutine, der registrerer driverforekomsten med DriverManager og forbinder denne klasse med databasemotor-id'en, såsom oracle eller postgres .

Når registreringen er fuldført, kan vi bruge denne identifikator inde i JDBC URL'en som jdbc:oracle .

En typisk driverregistreringsrutine vil instansiere driverforekomsten og videregive den til DriverManager.registerDriver metode:

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;
    }
}

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

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

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

Når denne egenskab er angivet, vil drivermanageren automatisk forsøge at indlæse den angivne JDBC-driver.

4. JDBC 4 tilgang

Problemet med automatisk serviceopdagelse blev løst med Java 1.6 og tjenesteudbydermekanismen . Det gør det muligt for tjenesteudbydere at angive 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. Men selv med tjenesteudbyderen på plads, vil manuel klasseindlæsning ikke forårsage fejl. Det er helt lovligt at påberåbe sig driverindlæsning eksplicit med nyere JVM'er og JDBC 4-drivere.

Tjenesteudbyderspecifikationen erstatter simpelthen manuel klasseindlæsning med en deklarativ tilgang. For eksempel har PostgreSQL JDBC-driveren en enkelt fil under META-INF/services/ . 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 af hver tilgang.

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


Java tag