Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Accesso ai dati in Quarkus: JDBC

Impariamo a stabilire una connessione JDBC a Postgres attraverso un datasource accessibile tramite la libreria Agroal
Impariamo a stabilire una connessione JDBC a Postgres attraverso un datasource accessibile tramite la libreria Agroal
Link copiato negli appunti

In questo articolo impareremo stabilire una connessione JDBC (Java DataBase Connectivity) attraverso un datasource accessibile tramite la libreria Agroal che consente di definire un java.sql.DataSource con connection pooling.

Un database pronto all'uso: Postgres

Avendo Linux come sistema di riferimento, iniziamo con un database verso il quale ci si possa connettere. Come visto in precedenza con la trattazione dell'accesso ai dati tramite le API Spring
in Quarkus, il modo più semplice e veloce è quello di utilizzare Docker per avere un'istanza Postgres immediatamente pronta all'uso.

Con Docker installato possiamo eseguire il comando run per avviare un'istanza Postgres:

docker run --ulimit memlock=-1:-1 -it --rm=true --memory-swappiness=0 --name postgres-quarkus -e POSTGRES_USER=scottus -e POSTGRES_PASSWORD=tigerus -e POSTGRES_DB=postgres -p 5432:5432 postgres:10.5

Successivamente installiamo un client a riga di comando per eseguire una connessione al database al fine di creare una tabella ed inserirvi dei dati:

apt install postgresql-client-common
apt-get install postgresql-client

La connessione al database Postgres è possibile quindi eseguendo il comando:

psql -h 0.0.0.0 --username=scottus postgres

specificando la password "tigerus" quando richiesto.

Ottenuto l'accesso al database eseguiamo i seguenti comandi SQL:

CREATE TABLE animal (
id bigint NOT NULL,
name character varying(100) NOT NULL,
type character varying(100) NOT NULL
);
INSERT INTO animal(id, name, type) VALUES (1, 'Tiger','Selvatic');
INSERT INTO animal(id, name, type) VALUES (2, 'Lion','Selvatic');
INSERT INTO animal(id, name, type) VALUES (3, 'Dog','Domestic');

per avere una tabella popolata da utilizzare con l'applicativo Quarkus.

DataSource JDBC

Dai precedenti articoli abbiamo imparato che tutto ciò che riguarda la configurazione in Quarkus risiede nel file application.properties, la configurazione di un datasource
non fa eccezione.

Attraverso poche proprietà, da specificare nel nostro file applicativo, saremo in grado di connetterci in pochi istanti. Apriamo l'application.properties e inseriamo
il seguente contenuto:

quarkus.datasource.db-kind=postgresql
quarkus.datasource.jdbc.url=jdbc:postgresql:postgres
quarkus.datasource.username=scottus
quarkus.datasource.password=tigerus
quarkus.datasource.jdbc.initial-size=10
quarkus.datasource.jdbc.min-size=10
quarkus.datasource.jdbc.max-size=20
quarkus.datasource.jdbc.background-validation-interval=2M
quarkus.datasource.jdbc.acquisition-timeout=5
quarkus.datasource.jdbc.validation-query-sql=SELECT 1
quarkus.datasource.jdbc.leak-detection-interval=2M

Attraverso le prime 4 proprietà specifichiamo il tipo di database al quel intendiamo collegarci, la stringa di connessione e le credenziali di accesso.

Le proprietà JDBC initial-size, min-size e max-size fanno riferimento alla dimensione iniziale del pool di connessioni, rispettivamente al suo valore minimo e massimo, durante l'esecuzione del server.

Il parametro background-validation-interval è l'intervallo di validazione delle connessioni idle (inattive) in background. Con acquisition-timeout definiamo invece il tempo massimo per l'acquisizione di una connessione.

La proprietà validation-query-sql permette di specificare una query da eseguire per la validazione di una connessione, mentre con il parametro leak-detection-interval definiamo l'intervallo temporale per il controllo delle connessioni perse. Concludiamo la configurazione aggiungendo le seguenti dipendenze Maven nel file pom.xml:

<dependency>
   <groupId>io.quarkus</groupId>
   <artifactId>quarkus-agroal</artifactId>
</dependency>
<dependency>
   <groupId>io.quarkus</groupId>
   <artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>
<dependency>
   <groupId>io.quarkus</groupId>
   <artifactId>quarkus-hibernate-orm</artifactId>
</dependency>

Un servizio di test

Siamo pronti per testare il lavoro svolto nei passi precedenti. Definiamo preliminarmente un servizio Rest che effettui una connesione al database, esegua una query verso
la tabella e restituisca una lista di animali in formato testo.

import io.agroal.api.AgroalDataSource;
import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
@Path("/jdbcService")
public class PostgresAccess {
    @Inject
    AgroalDataSource dataSource;
    @GET
    @Path("/test")
    @Produces(MediaType.TEXT_PLAIN)
    public Response testPostgres() throws SQLException {
        StringBuilder result = new StringBuilder();
        try(Connection connection=dataSource.getConnection()){
            Statement st = connection.createStatement();
            ResultSet rs = st.executeQuery("select * from animal");
            while(rs.next()){
                result.append(rs.getString(2)+" ");
            }
        }
        return  Response.ok(result).build();
    }
}

Avviamo l'applicazione Quarkus eseguendo il comando quarkus:dev da Intellij. Nell'immagine che segue mostriamo l'output dell'avvio di Quarkus per evidenziare il corretto caricamento delle librerie per l'accesso al database:

Avvio Quarkus

Figura 1. Avvio Quarkus

Utilizziamo Postman per eseguire facilmente la chiamata al servizio:

Quarkus test

Figura 2. Quarkus test

Come mostrato in Figura 2, il servizio risponde alla chiamata nel modo atteso, confermando il corretto funzionamento della configurazione definita nei paragrafi precedenti.

Ti consigliamo anche