Caricamento dei driver JDBC

Java Top

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO

1. Introduzione

JDBC è un insieme di specifiche che definiscono le parti API e SPI del contratto per Java Database Connectivity. Lo standard definisce l'astrazione del driver JDBC come il punto di ingresso principale per interagire con un database.

In questo tutorial, daremo uno sguardo ad alcuni dei passaggi di base necessari per caricare i driver JDBC.

2. Driver JDBC

Per connettersi a un database, dobbiamo ottenere un'istanza di un driver JDBC.

Possiamo ottenerlo tramite DriverManager specificando la stringa di connessione URL JDBC. Tale URL contiene il tipo di motore di database, nome database, nome host e porta, nonché altri parametri di connessione specifici del fornitore del database.

Utilizzando la stringa di connessione, possiamo ottenere un oggetto di connessione al database, che è l'unità fondamentale della comunicazione con il database in JDBC :

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

Come fa il gestore driver a sapere quale driver utilizzare se l'unica indicazione è l'URL specificato?

Potrebbero esserci molti driver JDBC sul classpath, quindi deve esserci un modo per distinguere ciascun driver in modo univoco.

3. Approccio legacy

Prima di JDBC versione 4 e Java SE 1.6, non esisteva alcun meccanismo generico nella JVM che consentisse ai servizi di essere rilevati e registrati automaticamente. Per questo motivo, è stato necessario un passaggio manuale per caricare la classe del driver JDBC per nome:

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

Il processo di caricamento della classe attiva una routine di inizializzazione statica che registra l'istanza del driver con DriverManager e associa questa classe all'identificativo del motore di database, come oracle o postgres .

Una volta completata la registrazione, possiamo utilizzare questo identificatore all'interno dell'URL JDBC come jdbc: oracle .

Una tipica routine di registrazione del driver creerà un'istanza del driver e la passerà al metodo 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'esempio sopra mostra la registrazione del driver JDBC Postgres con DriverManager . Viene attivato dalla JVM come parte dell'inizializzatore statico.

È possibile automatizzare parzialmente questo passaggio anche con l'approccio legacy impostando la proprietà di sistema jdbc.drivers :

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

Quando questa proprietà è specificata, il gestore driver tenterà automaticamente di caricare il driver JDBC specificato.

4. Approccio JDBC 4

Il problema del rilevamento automatico del servizio è stato risolto con Java 1.6 e il meccanismo del provider di servizi . Consente ai fornitori di servizi di dichiarare i propri servizi inserendoli in META-INF / services all'interno del file JAR contenente i servizi.

Questo meccanismo registra automaticamente il driver in modo che il passaggio manuale per caricare la classe non sia più necessario. Tuttavia, anche con il fornitore di servizi attivo, il caricamento manuale della classe non causerà errori. È perfettamente legale invocare il caricamento del driver in modo esplicito con JVM recenti e driver JDBC 4.

La specifica del fornitore di servizi sostituisce semplicemente il caricamento manuale della classe con un approccio dichiarativo. Ad esempio, il driver JDBC PostgreSQL ha un singolo file in META-INF / services / . Il nome file è java.sql.Driver (che è una convenzione consolidata per i driver JDBC). Contiene il nome classe completo del driver JDBC, che, in questo caso, è org.postgresql.Driver .

5. conclusione

In questo articolo, abbiamo esaminato i concetti di base su JDBC, nonché vari metodi per caricare i driver JDBC, con una spiegazione di ciascun approccio.

Come al solito, il codice sorgente completo dell'articolo è disponibile su GitHub.

Fondo Java

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO