Post Views: 2,227

Ehi, amanti del tè!. Hai mai sentito parlare del pool di connessioni in JDBC o HikariCP? In caso contrario, nessuna preoccupazione a tutti, questo è ciò che questo post è tutto. Parleremo di tutte le cose sul pool di connessioni JDBC e sulla sua implementazione usando HikariCP.

HikariCP è uno dei più veloci pool di connessioni disponibili sul mercato per la connessione JDBC. Rende collegamento pooling molto facile. preparatevi a saperne di più su questa bestia. Ma prima, prepara il tuo tè per sorseggiare e imparare. E per l’esempio usato nel post, puoi trovarlo su GitHub qui o il progetto completo qui.

Puoi seguirmi sui social @ coderstea su Twitter, Linkedin, Facebook o Instagram. Condividiamo anche video di alta qualità sulla programmazione sul nostro canale Youtube Puoi anche pubblicare il tuo post su CodersTea.com, solo condivida il Suo pensiero su Ci Contatti.

Che cos’è il pool di connessioni?

Il pool di connessioni in JDBC ci consente di riutilizzare la connessione JDBC piuttosto che crearla ogni volta. Quando viene chiamato restituisce la connessione JDBC che non è in uso( o crearne una nuova se la sua prima richiesta o il limite del pool non sono ancora stati raggiunti). Pensalo come il pool di risorse come le stampanti in una rete condivisa o DHCP o Pool di thread di cui abbiamo discusso nel post “Ricicla i thread e salva le risorse con il pool di thread”.

Perché usare Connection Pool?

Creare una connessione con il database è un processo costoso. Ci vuole tempo per connettersi con il database. Non è evidente per alcune volte, ma farlo per migliaia di volte, la frequenza stessa della tua applicazione per aver bisogno di chiamare i database, può diventare molto lenta. Supponiamo che ci vogliano 5 ms per connettersi a DB e 10 ms per una query, quindi circa 15 ms per la prima volta. Fallo per 1000 volte e puoi sentire la differenza. Più del 30% del tempo è sprecato nella creazione della connessione.

Un altro scenario, supponiamo che la connessione stia prendendo 5ms ma la query sta prendendo solo 4ms, quindi più del 60% sta andando per la creazione. Hai capito.

Ma nel pool di connessioni, non stai creando una connessione ogni volta, invece, la stai riutilizzando. Il riciclaggio non solo aiuta l’ambiente, ma anche le prestazioni del nostro sistema. Attraverso questo sovraccarico di risorse di riciclaggio diminuisce. È possibile limitare il numero di connessioni pure che può aiutare nel controllo del traffico al database. Ci sono anche altri fattori per migliorare le prestazioni. Puoi conoscere quelli nel mio altro articolo “Come raggiungere la grandezza nelle prestazioni JDBC”;

Quando usare il pool di connessioni?

Ok, ha molti vantaggi, ma potrebbero esserci scenari in cui non ha senso utilizzare il pool di connessioni. Penso che dovremmo usarlo quando possibile in quanto riduce gran parte del lavoro. Come la connessione automatica al database in caso di timeout. Dovrebbe essere la scelta principale, nel caso in cui l’applicazione chiami frequentemente il database o sia fortemente dipendente dal database.

Per una semplice applicazione in cui chiami il database una volta ogni tanto come un giorno o qualcosa del genere, probabilmente non ne hai bisogno. Oppure puoi semplicemente impostare il limite del pool su uno in modo che ci sia solo una connessione nel pool. In un ambiente multithread, se si desidera che tutti i thread utilizzino la stessa connessione anziché ogni thread per creare le proprie connessioni DB, il pool di connessioni è il salvatore per te.

Cose da tenere a mente quando si utilizza il pool di connessioni

Una cosa è necessario fare attenzione a chiudere la connessione. Se non si chiude la connessione dopo averla utilizzata, non tornerà alla piscina. E un’altra parte del tuo programma potrebbe aspettarlo. L’approccio migliore è usare try-with-resources, che vedi in dettaglio qui. E potresti dover spiegare al tuo nuovo collega / amico cosa, perché e come usare il pool di connessioni se lui o lei non lo sa. Che non è che molto di un grande compito dal momento che si può solo condividere questo post con loro per ogni evenienza (Auto-promozione ?).

Esplora il poling della connessione JDBC con HikariCP

A questo punto, spero che tu abbia capito cos’è il pool di connessioni JDBC, perché e quando usarlo, e i suoi vantaggi e svantaggi. Una cosa rimane è, come usarlo. Può essere fatto molto facilmente da HikariCP e offre molte più prestazioni di qualsiasi altra libreria di pool di connessioni. HikariCP è una libreria Java connection pool molto veloce e leggera là fuori. L’API e la base di codice complessiva sono relativamente piccole, una grande cosa e altamente ottimizzate. È molto facile da configurare e utilizzare.

Prima di usarlo passiamo attraverso i prerequisiti.

Aggiunta di HikariCP nel progetto

Esistono diversi modi per caricare HikariCP sul progetto.

Aggiungendo manualmente la libreria HikariCP

Per il progetto Java semplice, è possibile scaricare il jar da Maven Repo e scaricare l’ultimo ‘HikariCP’. Esiste anche il supporto per le versioni Java precedenti, che possono essere facilmente identificate nella pagina di download.

Aggiunta di HikariCP con Build Frameworks

Per build frameworks, come Maven o Gradle, è possibile dipendenze. Al momento della creazione di questo blog, 3.4.1 era l’ultimo. Si prega di controllare l’ultimo quando lo si utilizza, che può essere trovato su MvnRepository. Può darti il testo delle dipendenze sia in formato Maven che Gradle.

Maven

<!--Java 8 to 11 maven artifact--><dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <!-- use the latest verion if possible. This was the latest on the birth of this blog --> <version>3.4.1</version></dependency><!-- Java 7 maven artifact (maintenance mode) --><dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP-java7</artifactId> <version>2.4.13</version></dependency><!-- Java 6 maven artifact (maintenance mode) --><dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP-java6</artifactId> <version>2.3.13</version></dependency>

Gradle

//Java 8 to 11compile "com.zaxxer:HikariCP:3.4.1"//java 7compile "com.zaxxer:HikariCP-java7:2.4.13"//Java 6compile "com.zaxxer:HikariCP-java6:2.3.13"

Creare una Connessione JDBC con Piscina HikariCP

Durante la Creazione di HikariCP oggetto DataSource, un’interfaccia per la Connessione fornito da Java, è necessario configurare la piscina. Questo include URL JDBC, utente, password, dimensione del pool tra le altre cose. Di seguito sono riportate le impostazioni di configurazione essenziali e comuni e le relative descrizioni.

Metodi Descreptions
setJdbcUrl(String) Impostare l’URL JDBC
setUsername(String) Impostare il nome utente
setPassword(Stringa) Impostare la password
setDriverClassName(String) Passare il driver di classe di nome
setMaximumPoolSize(int) numero massimo di connessioni che possono essere creati o risiede in piscina
setConnectionTimeout(lungo) Quanto tempo un utente può aspettare ottenere una connessione dalla piscina. se supera il limite di tempo viene generata una SQlException
setMaximumPoolSize (int) Il tempo massimo in cui una connessione può rimanere inattiva nel pool. Se supera il limite di tempo viene rimosso dalla piscina. Se non vuoi ritirare le connessioni, metti semplicemente 0.
setPoolName (String) Imposta il nome del pool corrente. Questo è facoltativo, non devi farlo.
Hkari CP Configuration

Esempio e codice per HikariCP

Ho inserito i commenti per mostrare cosa sta facendo esattamente. Ho scritto il codice nell’ordine inverso di creare la configurazione, passarla all’origine dati, ottenere la connessione dall’origine dati e, infine, eseguire una query. Vediamo come funziona l’esempio.

Chiamiamo metodo statico getConnection per una connessione. Che getDataSource() per DataSource oggetto. Questo objects getConnection ci dà la connessione dal pool.

In getDataSource se dataSource è null,static DataSource oggetto, quindi creiamo uno con createDataSourcee configurando il pool con getHikariConfig. Nel main facciamo solo alcune semplici query.

import com.zaxxer.hikari.HikariConfig;import com.zaxxer.hikari.HikariDataSource;import javax.sql.DataSource;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.time.Duration;public class HikariCP { // static global DataSource object. private static DataSource dataSource; public static void main(String args) { String query = "SELECT COUNT(*) FROM employee"; //Using try-with-resources for auto closing connection, pstmt, and rs. try (Connection connection = getConnection(); PreparedStatement pstmt = connection.prepareStatement(query); ResultSet rs = pstmt.executeQuery(); ) { if (rs.next()) { System.out.println("Total employees are " + rs.getInt(1)); } } catch (SQLException e) { e.printStackTrace(); } } //Call the get connection method. static Connection getConnection() throws SQLException { return getDataSource().getConnection(); } //Get the DataSource. If not available create the new one //It is not threadsafe. I didn't wanted to complicate things. private static DataSource getDataSource() { if (null == dataSource) { System.out.println("No DataSource is available. We will create a new one."); createDataSource(); } return dataSource; } //To create a DataSource and assigning it to variable dataSource. private static void createDataSource() { HikariConfig hikariConfig = getHikariConfig(); System.out.println("Configuration is ready."); System.out.println("Creating the HiakriDataSource and assigning it as the global"); HikariDataSource hikariDataSource = new HikariDataSource(hikariConfig); dataSource = hikariDataSource; } //returns HikariConfig containing JDBC connection properties //which will be used by HikariDataSource object. private static HikariConfig getHikariConfig() { System.out.println("Creating the config with HikariConfig with maximum pool size of 5"); HikariConfig hikaConfig = new HikariConfig(); //This is same as passing the Connection info to the DriverManager class. //your jdbc url. in my case it is mysql. hikaConfig.setJdbcUrl("jdbc:mysql://localhost:3306/test"); //username hikaConfig.setUsername("root"); //password hikaConfig.setPassword("IWontTellYouThis ;)"); //driver class name hikaConfig.setDriverClassName("com.mysql.jdbc.Driver"); // Information about the pool //pool name. This is optional you don't have to do it. hikaConfig.setPoolName("MysqlPool-1"); //the maximum connection which can be created by or resides in the pool hikaConfig.setMaximumPoolSize(5); //how much time a user can wait to get a connection from the pool. //if it exceeds the time limit then a SQlException is thrown hikaConfig.setConnectionTimeout(Duration.ofSeconds(30).toMillis()); //The maximum time a connection can sit idle in the pool. // If it exceeds the time limit it is removed form the pool. // If you don't want to retire the connections simply put 0. hikaConfig.setIdleTimeout(Duration.ofMinutes(2).toMillis()); return hikaConfig; }}

Crea pool di connessioni multi-database

Ci sono diversi motivi per cui è necessario accedere a più database in un singolo progetto o base di codice. Il più comune è quello di migrare i dati da un server a un altro, o è un requisito architettonico. Qualunque sia la ragione, nel momento in cui devi fare lo stesso lavoro, tendi a copiare e incollare il codice, E JDBC è di per sé una definizione di codice boilerplate.

Tutti i dettagli sulla creazione di un pool di connessioni multi-database sono descritti in questo post: Come creare un pool multi-Database in HikariCP

Multi-Database Il codice del pool di HikariCP mira a ridurre il codice boilerplate al minimo, fornendo un codice piccolo e leggibile.

Conclusione

In questo post, abbiamo parlato di cosa è il pool di connessioni, perché usarlo e quando usarlo. Migliora notevolmente le prestazioni dell’applicazione pesante del database, ma può essere ulteriormente migliorata con alcuni trucchi nel mio altro post “Come raggiungere la grandezza nelle prestazioni di JDBC”. Esploriamo come utilizzare il pool di connessioni con l’aiuto di HikariCP, la libreria di pool di connessioni più veloce e leggera per java al momento della stesura di questo post. Puoi trovare il codice dell’esempio su GitHub qui o il progetto completo qui.

Posted on

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.