HikariCP - Pool di connessioni al database
Che cos'è
La creazione di nuove connessioni al database richiede una certa elaborazione, soprattutto quando è presente l'autenticazione.
Per questo motivo, per ottenere un maggiore guadagno in termini di prestazioni, conviene riutilizzare le connessioni e non aprire costantemente una nuova connessione.
Per risolvere questo problema si utilizza un pool di connessioni, che fa sì che quando una connessione viene scartata non venga realmente chiusa e distrutta; la connessione viene quindi messa in attesa per essere riutilizzata quando serve una nuova connessione.
Questo apporta grandi vantaggi in termini di prestazioni e consente anche molti più parametri di configurazione, incluso il più noto, ovvero limitare il numero massimo di connessioni per evitare sovraccarichi nel database.
HikariCP
Hikari significa luce in giapponese; è il più efficiente e ampiamente utilizzato nelle applicazioni Java, ed è famoso per avere di gran lunga le migliori prestazioni.
Il repository ufficiale di HikariCP può essere trovato qui su GitHub; consulta i grafici delle prestazioni e le informazioni sulle configurazioni.
Netuno utilizza HikariCP per gestire le connessioni a PostgreSQL, MariaDB, Microsoft SQL Server e Oracle.
Configurazione
La configurazione di HikariCP in Netuno viene effettuata insieme alla configurazione del database nelle applicazioni.
Ovvero, all'interno dell'applicazione nella cartella config nella configurazione dell'ambiente, come:
- _development.json
- _production.json
Nella sezione "db" sono contenute le configurazioni del database.
Sia per la connessione predefinita sia per qualsiasi altra, è possibile effettuare la configurazione dei parametri di HikariCP allo stesso modo.
Quindi, all'interno della voce default, dove sono presenti host, port, name (database), username e password, è sufficiente aggiungere altri parametri di HikariCP come:
...
"db": {
"default": {
"engine": "pg",
"host": "localhost",
"port": 5432,
"name": "mio_database",
"username": "mio_utente",
"password": "segreta",
"maximumPoolSize": 25,
"minimumIdle": 1,
"idleTimeout": 10000,
"maxLifetime": 60000
}
}
...
Ad esempio, ciascuna di queste configurazioni extra di HikariCP sopra riportate serve a:
maximumPoolSizedefinisce la dimensione massima delle connessioni in HikariCP; in questo esempio il limite di connessioni sarà 25.minimumIdledefinisce il numero minimo di connessioni in attesa nella coda per essere utilizzate.idleTimeoutè il tempo che la connessione può rimanere in attesa.maxLifetimeè il tempo massimo di vita della connessione.
Le configurazioni di HikariCP devono essere coerenti con la configurazione del motore del database. Ad esempio, il numero massimo di connessioni e i tempi limite non devono mai superare quanto definito nel motore del database.
Qualsiasi altro parametro di HikariCP può essere configurato allo stesso modo; è sufficiente aggiungere i parametri di configurazione desiderati.
Parametri
Di seguito è contenuto l'elenco dei parametri che Netuno consente di configurare per HikariCP.
Qualsiasi altro parametro di configurazione di HikariCP o è predefinito automaticamente da Netuno oppure non è applicabile.
Utilizzati frequentemente
autoCommit
Questa proprietà controlla il comportamento di conferma automatica predefinito delle connessioni restituite dal pool. È un valore booleano.
Predefinito: true
connectionTimeout
Questa proprietà controlla il numero massimo in millisecondi che un client (che sei tu) attenderà per una connessione dal pool. Se questo tempo viene superato senza che una connessione sia disponibile, verrà lanciata una SQLException. Il timeout di connessione più basso accettabile è di 250 ms.
Predefinito: 30000 (30 secondi)
idleTimeout
Questa proprietà controlla la quantità massima di tempo per cui a una connessione è consentito rimanere inattiva nel pool. Questa impostazione si applica solo quando minimumIdle è impostato a un valore inferiore a maximumPoolSize. Le connessioni inattive non vengono rimosse quando il pool raggiunge le connessioni minimumIdle. Se una connessione viene rimossa come inattiva o meno, è soggetta a una variazione massima di +30 secondi e a una variazione media di +15 secondi. Una connessione non verrà mai ritirata come inattiva prima di questo timeout. Un valore di 0 significa che le connessioni inattive non vengono mai rimosse dal pool. Il valore minimo consentito è 10000 ms (10 secondi).
Predefinito: 600000 (10 minuti)
maxLifetime
Questa proprietà controlla la durata di vita massima di una connessione nel pool. Una connessione in uso non verrà mai ritirata; solo quando è chiusa verrà quindi rimossa. Su base connessione per connessione, viene applicata un'attenuazione negativa minore per evitare la rimozione di massa nel pool. Consigliamo vivamente di impostare questo valore, e deve essere alcuni secondi più breve di qualsiasi timeout di connessione imposto da un database o da un'infrastruttura. Un valore di 0 indica una durata massima (durata infinita), soggetta evidentemente all'impostazione di idleTimeout. Il valore minimo consentito è 30000 ms (30 secondi).
Predefinito: 1800000 (30 minuti)
minimumIdle
Questa proprietà controlla il numero minimo di connessioni inattive che HikariCP cerca di mantenere nel pool. Se le connessioni inattive scendono al di sotto di questo valore e il totale delle connessioni nel pool è inferiore alla dimensione maximumPoolSize, HikariCP fa del suo meglio per aggiungere connessioni aggiuntive in modo rapido ed efficiente. Tuttavia, per prestazioni massime e capacità di risposta alle esigenze di picco, consigliamo di non impostare questo valore e, invece, di consentire a HikariCP di agire come un pool di connessioni di dimensione fissa.
Predefinito: uguale alla dimensione maximumPoolSize
maximumPoolSize
Questa proprietà controlla la dimensione massima che il pool può raggiungere, includendo sia le connessioni inattive sia quelle in uso. Fondamentalmente, questo valore determinerà il numero massimo di connessioni reali al backend del database. Un valore ragionevole è determinato meglio dal tuo ambiente di esecuzione. Quando il pool raggiunge questa dimensione e non sono disponibili connessioni inattive, le chiamate a getConnection() verranno bloccate fino a connectionTimeout millisecondi prima del timeout.
Predefinito: 10
Poco utilizzati
initializationFailTimeout
Questa proprietà controlla se il pool "fallirà rapidamente" se il pool non può essere inizializzato correttamente con una connessione iniziale. Qualsiasi numero positivo è considerato il numero di millisecondi per tentare di acquisire una connessione iniziale; il thread dell'applicazione verrà bloccato durante questo periodo. Se non è possibile acquisire una connessione prima di questo intervallo di tempo, verrà lanciata un'eccezione. Questo timeout viene applicato dopo il periodo di connectionTimeout. Se il valore è zero (0), HikariCP tenterà di ottenere e validare una connessione. Se viene ottenuta una connessione ma la validazione fallisce, verrà lanciata un'eccezione e il pool non verrà avviato. Tuttavia, se non è possibile ottenere una connessione, il pool verrà avviato, ma i successivi tentativi di ottenere una connessione potrebbero fallire. Un valore inferiore a zero aggirerà qualsiasi tentativo iniziale di connessione e il pool verrà avviato immediatamente mentre tenta di ottenere connessioni in background. Di conseguenza, i successivi tentativi di ottenere una connessione potrebbero fallire.
Predefinito: 1
catalog
Questa proprietà definisce il catalogo predefinito per i database che supportano il concetto di cataloghi. Se questa proprietà non è specificata, viene utilizzato il catalogo predefinito definito dal driver JDBC.
Predefinito: predefinito del driver
validationTimeout
Questa proprietà controlla il periodo massimo di tempo in cui una connessione verrà testata per verificarne la vitalità. Questo valore deve essere inferiore al tempo di connectionTimeout. Il timeout di validazione più basso accettabile è di 250 ms.
Predefinito: 5000
leakDetectionThreshold
Questa proprietà controlla la quantità di tempo in cui una connessione può rimanere fuori dal pool prima che venga registrato un messaggio che indichi una possibile fuga di connessione. Un valore di 0 significa che il rilevamento delle fughe è disabilitato. Il valore più basso accettabile per abilitare il rilevamento delle fughe è 2000 (2 secondi).
Predefinito: 0
schema
Questa proprietà definisce lo schema predefinito per i database che supportano il concetto di schemi. Se questa proprietà non è specificata, viene utilizzato lo schema predefinito definito dal driver JDBC.
Predefinito: predefinito del driver
DataSource
È anche possibile aggiungere configurazioni al DataSource, ovvero configurazioni aggiuntive specifiche per il tipo di database utilizzato.
Per realizzare questa configurazione più avanzata è necessario aggiungere l'oggetto di configurazione datasource all'interno dell'oggetto di configurazione della connessione al database.
Ad esempio, così:
...
"db": {
"default": {
"engine": "mariadb",
"host": "localhost",
"port": 3306,
"name": "mio_database",
"username": "mio_utente",
"password": "segreta",
"maximumPoolSize": 25,
"minimumIdle": 1,
"idleTimeout": 10000,
"maxLifetime": 60000,
"datasource": {
"cachePrepStmts": "true",
"prepStmtCacheSize": 250,
"prepStmtCacheSqlLimit": 2048
}
}
}
...
Nota che il valore delle configurazioni dei parametri del DataSource è di tipo string; in ogni caso Netuno converte automaticamente sempre in string.
Conclusione
Con l'utilizzo di HikariCP è possibile realizzare configurazioni avanzate per gestire il carico e il comportamento delle connessioni al database.
Potendo essere ottimizzato per gli scenari più diversi, garantendo prestazioni elevate.