Introduktion til HikariCP

1. Oversigt

I denne indledende artikel lærer vi om HikariCP JDBC-forbindelsespoolprojektet. Dette er en meget let (med cirka 130 KB) og lynhurtig JDBC-forbindelse pooling ramme udviklet af Brett Wooldridge omkring 2012.

2. Introduktion

Der er flere benchmarkresultater til rådighed for at sammenligne HikariCP's ydeevne med andre rammer for forbindelsespooling såsom c3p0, dbcp2, tomcatog vibur. For eksempel offentliggjorde HikariCP-teamet nedenfor benchmarks (originale resultater tilgængelige her):

Rammen er så hurtig, fordi følgende teknikker er blevet anvendt:

  • Bytecode-niveau engineering - nogle ekstreme bytecode-niveauteknik (inklusive native-kodning på forsamlingsniveau) er blevet udført
  • Mikrooptimeringer - skønt næppe målbare, øger disse optimeringer kombineret den samlede præstation
  • Intelligent brug af samlingerammen - det ArrayList blev erstattet med en brugerdefineret klasse Hurtigliste der fjerner rækkevidde kontrol og udfører fjernelse scanninger fra hale til hoved

3. Maven-afhængighed

Lad os oprette en prøveapplikation for at fremhæve dens anvendelse. HikariCP leveres med support til alle de vigtigste versioner af JVM. Hver version kræver dens afhængighed; til Java 8 til 11 har vi:

 com.zaxxer HikariCP 3.4.5 

Ældre JDK-versioner som 6 og 7 understøttes også. De relevante versioner kan findes her og her. Vi kan også kontrollere de nyeste versioner i Central Maven Repository.

4. Anvendelse

Lad os nu oprette en demo-applikation. Bemærk, at vi skal medtage en passende afhængighed af JDBC-førerklassen i pom.xml. Hvis der ikke er nogen afhængigheder, vil applikationen kaste et ClassNotFoundException.

4.1. Oprettelse af en Datakilde

Vi bruger HikariCP'er Datakilde for at oprette en enkelt forekomst af en datakilde til vores applikation:

offentlig klasse DataSource {privat statisk HikariConfig config = ny HikariConfig (); privat statisk HikariDataSource ds; statisk {config.setJdbcUrl ("jdbc_url"); config.setUsername ("database_username"); config.setPassword ("database_password"); config.addDataSourceProperty ("cachePrepStmts", "true"); config.addDataSourceProperty ("prepStmtCacheSize", "250"); config.addDataSourceProperty ("prepStmtCacheSqlLimit", "2048"); ds = ny HikariDataSource (config); } privat DataSource () {} offentlig statisk forbindelse getConnection () kaster SQLException {return ds.getConnection (); }}

Punkt at bemærke her er initialiseringen i statisk blok.

HikariConfig er den konfigurationsklasse, der bruges til at initialisere en datakilde. Den leveres med fire kendte, brugte parametre brugernavn, adgangskode, jdbcUrl, dataSourceClassName.

Ud af jdbcUrl og dataSourceClassName, skal den ene bruges ad gangen. Når vi bruger denne egenskab med ældre drivere, skal vi muligvis indstille begge egenskaber.

Ud over disse egenskaber er der adskillige andre egenskaber til rådighed, som muligvis ikke alle tilbydes af andre poolrammer:

  • autoCommit
  • forbindelseTimeout
  • idleTimeout
  • maxLifetime
  • connectionTestQuery
  • forbindelseInitSql
  • validationTimeout
  • maximumPoolSize
  • poolnavn
  • allowPoolSuspension
  • Læs kun
  • transaktionIsolation
  • leakDetectionThreshold

HikariCP skiller sig ud på grund af disse databaseegenskaber. Det er avanceret nok til selv at opdage forbindelseslækager i sig selv!

En detaljeret beskrivelse af disse egenskaber kan findes her.

Vi kan også initialisere HikariConfig med en egenskabsfil placeret i ressourcer vejviser:

privat statisk HikariConfig config = ny HikariConfig ("datasource.properties");

Egenskabsfilen skal se sådan ud:

dataSourceClassName = // TBD dataSource.user = // TBD // andre egenskabsnavne skal starte med dataSource som vist ovenfor

Vi kan bruge java.util.Properties-baseret konfiguration:

Egenskaber rekvisitter = nye egenskaber (); props.setProperty ("dataSourceClassName", // TBD); props.setProperty ("dataSource.user", // TBD); // setter for andre krævede egenskaber privat statisk HikariConfig config = ny HikariConfig (rekvisitter);

Alternativt kan vi initialisere en datakilde direkte:

ds.setJdbcUrl (// TBD); ds.setUsername (// TBD); ds.setPassword (// TBD);

4.2. Brug af en datakilde

Nu hvor vi har defineret datakilden, kan vi bruge den til at opnå en forbindelse fra den konfigurerede forbindelsespulje og udføre JDBC-relaterede handlinger.

Antag at vi har to tabeller navngivet afd og emp at simulere en medarbejderafdelings brugssag. Vi skriver en klasse for at hente disse detaljer fra databasen ved hjælp af HikariCP.

Nedenfor viser vi de SQL-sætninger, der er nødvendige for at oprette eksempeldataene:

Opret tabelafd. (deptno numerisk, dname varchar (14), loc varchar (13), begrænsning pk_dept primær nøgle (deptno)); Opret tabel emp (empno numerisk, ename varchar (10), job varchar (9), mgr numerisk, ansat dato, sal numerisk, komm numerisk, deptno numerisk, begrænsning pk_emp primær nøgle (empno), begrænsning fk_deptno fremmed nøgle (deptno) referencer dept (deptno)); indsæt i deptværdier (10, 'REGNSKAB', 'NEW YORK'); indsæt i deptværdier (20, 'FORSKNING', 'DALLAS'); indsæt i deptværdier (30, 'SALES', 'CHICAGO'); indsæt i dept-værdier (40, 'OPERATIONS', 'BOSTON'); indsæt i emp-værdier (7839, 'KING', 'PRESIDENT', null, to_date ('17 -11-1981 ',' dd-mm-åååå '), 7698, null, 10); indsæt i emp-værdier (7698, 'BLAKE', 'MANAGER', 7839, to_date ('1-5-1981', 'dd-mm-åååå'), 7782, null, 20); indsæt i emp-værdier (7782, 'CLARK', 'MANAGER', 7839, to_date ('9-6-1981', 'dd-mm-åååå'), 7566, null, 30); indsæt i emp-værdier (7566, 'JONES', 'MANAGER', 7839, to_date ('2-4-1981', 'dd-mm-åååå'), 7839, null, 40);

Bemærk, at hvis vi bruger en hukommelsesdatabase såsom H2, er vi nødt til automatisk at indlæse databasescriptet, før vi kører den aktuelle kode for at hente dataene. Heldigvis kommer H2 med en I DET parameter, der kan indlæse databasescriptet fra klassestien ved kørsel. JDBC-URL'en skal se ud:

jdbc: h2: mem: test; DB_CLOSE_DELAY = -1; INIT = runcript fra 'classpath: /db.sql'

Vi er nødt til at oprette en metode til at hente disse data fra databasen:

offentlig statisk liste fetchData () kaster SQLException {String SQL_QUERY = "vælg * fra emp"; Liste medarbejdere = null; prøv (Forbindelse con = DataSource.getConnection (); PreparedStatement pst = con.prepareStatement (SQL_QUERY); ResultSet rs = pst.executeQuery ();) {medarbejdere = ny ArrayList (); Medarbejdermedarbejder; mens (rs.next ()) {medarbejder = ny medarbejder (); medarbejder.setEmpNo (rs.getInt ("empno")); medarbejder.setEname (rs.getString ("ename")); medarbejder.setJob (rs.getString ("job")); medarbejder.setMgr (rs.getInt ("mgr")); medarbejder.setHiredate (rs.getDate ("ansat")); medarbejder.setSal (rs.getInt ("sal")); medarbejder.setComm (rs.getInt ("komm")); medarbejder.setDeptno (rs.getInt ("deptno")); medarbejdere. tilføj (medarbejder); }} returnere medarbejdere }

Nu skal vi oprette en JUnit-metode til at teste den. Da vi kender antallet af rækker i tabellen emp, kan vi forvente, at størrelsen på den returnerede liste skal være lig med antallet af rækker:

@Test offentlig ugyldighed givenConnection_thenFetchDbData () kaster SQLException {HikariCPDemo.fetchData (); assertEquals (4, medarbejderstørrelse ()); }

5. Konklusion

I denne hurtige vejledning lærte vi om fordelene ved at bruge HikariCP og dens konfiguration.

Som altid er den fulde kildekode tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found