Connessioni e DataSource
2025 – prof. Roberto Fuligni
In JDBC, Connection
e DataSource
sono due strumenti utilizzati per gestire l’accesso ai database, ma con approcci diversi.
Una Connection
rappresenta una connessione diretta e attiva con il database, creata tramite il DriverManager
. Quando un’applicazione ha bisogno di comunicare con il database, deve richiedere esplicitamente una connessione passando l’URL del database, il nome utente e la password. Questa connessione viene aperta e utilizzata per eseguire query SQL, e alla fine deve essere chiusa manualmente per evitare il consumo eccessivo di risorse. L’utilizzo diretto di Connection è semplice, ma può diventare inefficiente, soprattutto in applicazioni che richiedono un numero elevato di connessioni simultanee, perché ogni volta che viene effettuata una richiesta al database, viene creata una nuova connessione da zero.
Il DataSource
, invece, offre un approccio più avanzato e flessibile. Piuttosto che creare connessioni ogni volta che servono, fornisce un meccanismo di gestione automatizzata, spesso basato su un connection pool. Questo significa che le connessioni al database vengono riutilizzate e gestite dinamicamente, riducendo il tempo necessario per stabilire nuove connessioni e migliorando le prestazioni complessive dell’applicazione. L’utilizzo di un DataSource
è particolarmente vantaggioso nelle applicazioni enterprise, dove la gestione efficiente delle risorse è fondamentale. Può essere configurato direttamente nel server applicativo, evitando di dover scrivere nel codice i dettagli di connessione come username e password, rendendo così l’applicazione più sicura e più facilmente manutenibile.
Mentre l’uso diretto di Connection
può essere sufficiente per piccoli progetti o test, il DataSource
è la scelta più indicata per applicazioni complesse e ad alto traffico, grazie alla sua capacità di ottimizzare le prestazioni e la gestione delle connessioni al database.
DataSource
Esistono diversi tipi di DataSource
disponibili per gestire le connessioni a un database in modo efficiente, ognuno con caratteristiche specifiche che lo rendono più o meno adatto a determinati scenari.
Uno dei DataSource più semplici è quello fornito direttamente dai driver JDBC del database. Per esempio, MariaDB offre l’implementazione base MariaDbDataSource
, che permette di configurare la connessione impostando direttamente l’URL del database, il nome utente e la password. Tuttavia, questo DataSource
di base non gestisce autonomamente il pooling delle connessioni, quindi ogni volta che viene richiesta una connessione, ne viene creata una nuova, senza meccanismi per riutilizzarle.
Per ovviare a questo problema, si utilizzano DataSource
più avanzati con connection pooling, cioè con la capacità di riutilizzare le connessioni invece di crearle e distruggerle continuamente.
HikariCP
HikariCP è oggi considerato uno dei connection pool più efficienti e performanti. Esso è noto per la sua velocità e per la sua capacità di gestire le connessioni in modo ottimizzato, riducendo al minimo il tempo di attesa e il consumo di memoria.
Per configurare il pool, si definisce un oggetto HikariConfig
con i parametri di connessione e si utilizza poi un HikariDataSource
per ottenere le connessioni dal pool. Questo tipo di DataSource
è particolarmente adatto per applicazioni moderne che richiedono alta efficienza e bassa latenza.
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
...
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mariadb://localhost:3306/db");
config.setUsername("user");
config.setPassword("password");
config.setMaximumPoolSize(10); // Numero massimo di connessioni nel pool
config.setMinimumIdle(2); // Numero minimo di connessioni inattive
config.setIdleTimeout(30000); // Tempo massimo di inattività per una connessione (ms)
config.setMaxLifetime(1800000); // Tempo massimo di vita di una connessione (ms)
try (HikariDataSource dataSource = new HikariDataSource(config)) {
try (Connection conn = dataSource.getConnection()) {
// Eseguire operazioni con la connessione...
}
} catch (SQLException e) {
e.printStackTrace();
}
MariaDB Connector/J
MariaDb Pool DataSource
Il MariaDB Connector/J offre un DataSource
avanzato chiamato MariaDbPoolDataSource. Il pool di connessioni offerto da MariaDbPoolDataSource
permette di gestire meglio la concorrenza e offre strumenti di monitoraggio per controllare lo stato delle connessioni attive. Il suo utilizzo può essere vantaggioso in contesti in cui si vuole una soluzione nativa e ottimizzata per MariaDB, evitando dipendenze aggiuntive.
Pool a livello di connessione
Il MariaDB Connector/J permette inoltre di abilitare il pooling direttamente a livello di connessione utilizzando l’opzione pool
, senza la necessità di gestire un oggetto MariaDbPoolDataSource
. Tuttavia, questo approccio ha un’importante differenza: non esiste un oggetto esplicito per chiudere il pool, il che significa che il pool rimane attivo fino a quando l’applicazione termina o il garbage collector libera le risorse.
Quando si utilizza pool=true
nell’URL di connessione JDBC, il driver gestisce automaticamente un pool di connessioni interne, senza richiedere un DataSource
specifico. Il vantaggio è che il pooling viene attivato senza dover modificare il codice per gestire un connection pool esplicito.
import org.mariadb.jdbc.MariaDbPoolDataSource;
import java.sql.Connection;
import java.sql.SQLException;
...
try (MariaDbPoolDataSource dataSource = new MariaDbPoolDataSource("jdbc:mariadb://localhost:3306/db")) {
dataSource.setUser("user");
dataSource.setPassword("password");
dataSource.setMaxPoolSize(10); // Numero massimo di connessioni nel pool
try (Connection conn = dataSource.getConnection()) {
// Eseguire operazioni con la connessione...
}
} catch (SQLException e) {
e.printStackTrace();
}
String url = "jdbc:mariadb://localhost:3306/db?pool&maxPoolSize=4";
String user = "user";
String password = "password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// Eseguire operazioni con la connessione...
} catch (SQLException e) {
e.printStackTrace();
}
Altri pool di connessioni
Inoltre, in ambienti Java EE, è comune affidarsi a soluzioni integrate, come il connection pool di Apache Commons DBCP o Tomcat JDBC Pool, che forniscono funzionalità di pooling direttamente gestibili a livello di container applicativo. Queste soluzioni sono particolarmente utili nei server enterprise, dove il DataSource
viene configurato direttamente nel contesto del server senza dover scrivere codice Java esplicito per la gestione delle connessioni.