indlæg visninger: 2,227

Hej, te elskere!. Har du nogensinde hørt om forbindelse pooling i JDBC eller HikariCP? Hvis ikke, ingen bekymringer overhovedet, det er hvad dette indlæg handler om. Vi vil tale om alle ting om JDBC-forbindelsespuljen og dens implementering ved hjælp af HikariCP.

HikariCP er en af de hurtigste forbindelsespuljer, der findes på markedet for JDBC-forbindelse. Det gør forbindelsen pooling meget let. gør dig klar til at lære mere om dette dyr. Men før, gør din te til at nippe og lære. Og for det eksempel, der bruges i indlægget, kan du finde det på GitHub her eller det fulde projekt her.

du kan følge mig på social @ coderstea på kvidre, Linkedin, Facebook eller Instagram. Vi deler også videoer af høj kvalitet om programmering på vores Youtube-kanal, Du kan også offentliggøre dit eget indlæg på CodersTea.com, bare Del din tanke på Kontakt os.

Hvad er forbindelse Pooling?

Forbindelsespooling i JDBC giver os mulighed for at genbruge JDBC-forbindelsen i stedet for at oprette hver gang. Når den kaldes, returnerer den JDBC-forbindelsen, som ikke er i brug( eller opret en ny, hvis dens første anmodning eller poolgrænse endnu ikke er nået). Tænk på det som din ressource pooling som printere i et delt netværk eller DHCP eller tråd Pool, som vi diskuterede i “genbrug trådene og gem ressourcerne med tråd Pool” indlæg.

Hvorfor Bruge Connection Pool?

oprettelse af en forbindelse med databasen er en dyr proces. Det tager tid at oprette forbindelse til databasen. Det er ikke mærkbart for et par gange, men gør det i tusindvis af gange, selve hyppigheden af din ansøgning om at skulle ringe til databaserne, det kan blive meget trægt. Antag, at det tager 5ms at oprette forbindelse til DB og 10 ms for en forespørgsel, så omkring 15 ms for første gang. Gør det 1000 gange, og du kan mærke forskellen. Mere end 30% af tiden spilder på at skabe forbindelsen.

et andet scenario ville antage, at forbindelsen tager 5ms, men forespørgslen tager kun 4ms, så går mere end 60% til oprettelse. Du får ideen.

men i forbindelse pooling opretter du ikke en forbindelse hver gang, i stedet genbruger du den. Genbrug hjælper ikke kun miljøet, men også vores systemydelse. Gennem denne genanvendelse ressource overhead falder. Du kan også begrænse antallet af forbindelser, som kan hjælpe med trafikstyring til databasen. Der er også andre faktorer til forbedring af ydeevnen. Du kan lære om dem i min anden artikel “Sådan opnår du storhed i JDBC Performance”;

Hvornår skal du bruge Connection Pool?

Ok, Det har mange fordele, men der kan være scenarier, hvor det ikke giver mening at bruge forbindelsespooling. Jeg synes, vi skal bruge det, når det er muligt, da det reducerer meget af arbejdet. Såsom automatisk forbindelse til databasen i tilfælde af timeout. Det bør være dit primære valg, hvis din ansøgning ofte kalder databasen, eller den er stærkt afhængig af databasen.

for et simpelt program, hvor du kalder databasen en gang imellem som en dag eller noget, så har du sandsynligvis ikke brug for det. Eller du kan bare indstille poolgrænsen til en, så der kun er en forbindelse i poolen. I et flertrådet miljø, hvis du vil have alle trådene til at bruge den samme forbindelse i stedet for hver tråd til at oprette deres egne DB-forbindelser, er forbindelsespooling Frelseren for dig.

ting at huske på, når du bruger forbindelse Pooling

en ting du skal være forsigtig med at lukke forbindelsen. Hvis du ikke lukker forbindelsen efter brug af den, går den ikke tilbage til poolen. Og en anden del af dit program venter muligvis på det. Den bedste tilgang er at bruge try-med-ressourcer, som du ser detaljeret her. Og du skal muligvis forklare din nye kollega / ven om hvad, hvorfor og hvordan du bruger forbindelsespooling, hvis han eller hun ikke ved det. Det er ikke så meget af en stor opgave, da du bare kan dele dette indlæg med dem bare i tilfælde (selvpromovering ?).

Udforsk JDBC Connection Poling med HikariCP

på dette tidspunkt håber jeg, at du har forstået, hvad JDBC connection pooling er, hvorfor og hvornår du skal bruge den, og dens fordel og ulemper. En ting er tilbage, hvordan man bruger det. Det kan gøres meget nemt ved HikariCP og giver meget mere ydeevne end nogen anden forbindelse pooling bibliotek. HikariCP er en meget hurtig og let Java-forbindelse pool Bibliotek derude. API ‘ en og den samlede kodebase er relativt lille, en god ting og meget optimeret. Det er meget nemt at sætte op og bruge.

før du bruger det lad os gå gennem forudsætninger.

tilføjelse af HikariCP i dit projekt

der er flere måder, du kan indlæse HikariCP på til dit projekt.

manuel tilføjelse af hikaricp-bibliotek

til almindeligt Java-projekt kan du hente krukken fra Maven Repo og hente den nyeste ‘HikariCP’. Der er også understøttelse af ældre Java-versioner, som let kan identificeres på overførselssiden.

tilføjelse HikariCP med Build rammer

for build rammer, såsom Maven eller Gradle du kan afhængigheder. På tidspunktet for oprettelsen af denne blog var 3.4.1 den seneste. Kontroller den nyeste, når du bruger den, som kan findes på MvnRepository. Det kan give dig afhængigheder tekst i både Maven eller Gradle format.

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"

oprettelse af JDBC Connection Pool med HikariCP

mens du opretter HikariCP DataSource object, en grænseflade til Forbindelsespulje leveret af Java, skal vi konfigurere puljen. Dette inkluderer JDBC URL, bruger, adgangskode, poolstørrelse blandt andet. Følgende er de væsentlige og fælles konfigurationsindstillinger og deres beskrivelser.

metoder Descreptions
setJdbcUrl (String) Indstil jdbc URL
setUsername (String) Indstil brugernavnet
setadgangskode (streng) Indstil adgangskoden
setDriverClassName (String) send driverklassenavnet til det
(int) Den maksimale forbindelse, der kan oprettes af eller bor i poolen
setConnectionTimeout (lang) hvor lang tid en bruger kan vente med at få en forbindelse fra poolen. hvis det overskrider fristen, kastes en Kvblekception
setmaksimal poolstørrelse (int) Den maksimale tid en forbindelse kan sidde inaktiv i poolen. Hvis den overskrider fristen, fjernes den fra poolen. Hvis du ikke ønsker at gå på pension forbindelserne blot sætte 0.
setPoolName (String) Det indstiller det aktuelle poolnavn. Dette er valgfrit, Du behøver ikke at gøre det.
Hkari CP Configuration

eksempel og kode for HikariCP

jeg har lagt kommentarerne for at vise, hvad det præcist gør. Jeg har skrevet koden i omvendt rækkefølge for at oprette Config, sende den til datakilden, få forbindelsen fra datakilden og endelig udføre en forespørgsel. Lad os se, hvordan eksemplet fungerer.

vi kalder statisk getConnection metode til en forbindelse. Hvilket getDataSource() til DataSource objekt. Dette objekter getConnection giver os forbindelsen fra poolen.

i getDataSource hvis dataSource er null,static DataSource objekt, så opretter vi en med createDataSourceog konfigurerer puljen med getHikariConfig. I main gør vi bare nogle enkle forespørgsler.

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; }}

Opret Multi-Database Connection Pool

der er flere grunde til, at du skal have adgang til flere databaser i et enkelt projekt eller en kodebase. Det mest almindelige er at migrere dataene fra en server til en anden, eller det er et arkitektonisk krav. Uanset hvad årsagen er, i det øjeblik du skal gøre det samme arbejde, har du en tendens til at kopiere-indsætte koden, og JDBC er i sig selv en definition af kedelpladekode.

alle detaljer om oprettelse af en multi-database-forbindelsespulje er beskrevet i dette indlæg: Sådan oprettes en Multi-Database-Pool i HikariCP

Multi-Database HikariCP-puljekode sigter mod at reducere kedelpladekoden til et absolut minimum, hvilket giver dig en lille og læsbar kode.

konklusion

i dette indlæg talte vi om, hvad der er forbindelsespooling, hvorfor man bruger det, og hvornår man skal bruge det. Det forbedrer i høj grad udførelsen af database tung applikation, men det kan forbedres yderligere med nogle tricks i mit andet indlæg “Sådan opnår du storhed i JDBC Performance”. Vi undersøger, hvordan man bruger forbindelsespooling ved hjælp af HikariCP, det hurtigste og lette forbindelsespuljebibliotek til java på tidspunktet for skrivning af dette indlæg. Du kan finde koden til eksemplet på GitHub her eller det fulde projekt her.

Posted on

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.