Introduksjon til HikariCP

1. Oversikt

I denne innledende artikkelen vil vi lære om HikariCP JDBC-tilkoblingsbassengprosjektet. Dette er et veldig lett (på omtrent 130Kb) og lynrask JDBC-tilkoblingsrammer utviklet av Brett Wooldridge rundt 2012.

2. Introduksjon

Det er flere referanseresultater tilgjengelig for å sammenligne ytelsen til HikariCP med andre rammeverk for tilkobling c3p0, dbcp2, tomcat, og vibur. For eksempel publiserte HikariCP-teamet nedenfor referanser (originale resultater tilgjengelig her):

Rammeverket er så raskt fordi følgende teknikker er brukt:

  • Bytecode-nivå engineering - noen ekstreme bytecode nivå engineering (inkludert native koding på monteringsnivå) har blitt gjort
  • Mikrooptimaliseringer - Selv om de knapt er målbare, øker disse optimaliseringene den totale ytelsen
  • Intelligent bruk av rammeverket for samlinger - de ArrayList ble erstattet med en tilpasset klasse FastList som eliminerer rekkeviddskontroll og utfører skanning av fjerning fra hale til hode

3. Maven avhengighet

La oss bygge et eksempel på en applikasjon for å markere bruken. HikariCP kommer med støtte for alle hovedversjonene av JVM. Hver versjon krever avhengighet; for Java 8 til 11 har vi:

 com.zaxxer HikariCP 3.4.5 

Eldre JDK-versjoner som 6 og 7 støttes også. De aktuelle versjonene finner du her og her. Vi kan også sjekke de nyeste versjonene i Central Maven Repository.

4. Bruk

La oss nå lage en demo-applikasjon. Vær oppmerksom på at vi må inkludere en passende JDBC-førerklasseavhengighet i pom.xml. Hvis det ikke er noen avhengigheter, vil søknaden kaste et ClassNotFoundException.

4.1. Opprette en Datakilde

Vi bruker HikariCP Datakilde for å opprette en enkelt forekomst av en datakilde for applikasjonen vår:

public class DataSource {private static HikariConfig config = new 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); } private DataSource () {} public static Connection getConnection () kaster SQLException {return ds.getConnection (); }}

Merk å merke seg her er initialiseringen i statisk blokkere.

HikariConfig er konfigurasjonsklassen som brukes til å initialisere en datakilde. Den kommer med fire kjente må-brukte parametere brukernavn, passord, jdbcUrl, dataSourceClassName.

Ut av jdbcUrl og dataSourceClassName, skal den ene brukes om gangen. Imidlertid, når du bruker denne egenskapen med eldre drivere, kan det hende at vi må angi begge egenskapene.

I tillegg til disse egenskapene er det flere andre tilgjengelige eiendommer som kanskje ikke alle tilbys av andre pooling-rammer:

  • autoCommit
  • connectionTimeout
  • idleTimeout
  • maxLifetime
  • connectionTestQuery
  • connectionInitSql
  • validationTimeout
  • maximumPoolSize
  • bassengnavn
  • allowPoolSuspension
  • lesKun
  • transactionIsolation
  • leakDetectionTreshold

HikariCP skiller seg ut på grunn av disse databaseegenskapene. Den er avansert nok til å til og med oppdage tilkoblingslekkasjer av seg selv!

En detaljert beskrivelse av disse egenskapene finner du her.

Vi kan også initialisere HikariConfig med en eiendomsfil plassert i ressurser katalog:

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

Egenskapsfilen skal se ut slik:

dataSourceClassName = // TBD dataSource.user = // TBD // navn på andre egenskaper skal starte med dataSource som vist ovenfor

Vi kan bruke java.util.Properties-basert konfigurasjon også:

Egenskaper rekvisitter = nye egenskaper (); props.setProperty ("dataSourceClassName", // TBD); props.setProperty ("dataSource.user", // TBD); // setter for andre nødvendige egenskaper 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. Bruke en datakilde

Nå som vi har definert datakilden, kan vi bruke den til å få en forbindelse fra den konfigurerte tilkoblingsgruppen og utføre JDBC-relaterte handlinger.

Anta at vi har to bord gjeld og emp å simulere en brukersak for ansattes avdeling. Vi vil skrive en klasse for å hente disse detaljene fra databasen ved hjelp av HikariCP.

Nedenfor viser vi de SQL-setningene som er nødvendige for å lage eksempeldataene:

lage tabellavd. (avd. numerisk, dnavn varchar (14), loc varchar (13), begrensning pk_dept primærnøkkel (avd.)); opprette tabell emp (empno numerisk, ename varchar (10), jobb varchar (9), mgr numerisk, ansatt dato, sal numerisk, comm numerisk, deptno numerisk, begrensning pk_emp primærnøkkel (empno), begrensning fk_deptno fremmed nøkkel (deptno) referanser avd. (deptno)); sett inn i avdelingsverdier (10, 'REGNSKAP', 'NEW YORK'); sett inn i dybdeverdier (20, 'FORSKNING', 'DALLAS'); sett inn verdier (30, 'SALES', 'CHICAGO'); sett inn i avdelingsverdier (40, 'OPERATIONS', 'BOSTON'); sett inn i emp-verdier (7839, 'KING', 'PRESIDENT', null, to_date ('17 -11-1981 ',' dd-mm-åååå '), 7698, null, 10); sett inn i emp-verdier (7698, 'BLAKE', 'MANAGER', 7839, to_date ('1-5-1981', 'dd-mm-åååå'), 7782, null, 20); sett inn i emp-verdier (7782, 'CLARK', 'MANAGER', 7839, to_date ('9-6-1981', 'dd-mm-åååå'), 7566, null, 30); sett inn i emp-verdier (7566, 'JONES', 'MANAGER', 7839, to_date ('2-4-1981', 'dd-mm-åååå'), 7839, null, 40);

Vær oppmerksom på at hvis vi bruker en minnedatabase som H2, må vi automatisk laste inn databasescriptet før vi kjører den faktiske koden for å hente dataene. Heldigvis kommer H2 med en I DET parameter som kan laste databaseskriptet fra klassestien ved kjøretid. JDBC-nettadressen skal se ut som:

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

Vi må lage en metode for å hente disse dataene fra databasen:

offentlig statisk liste fetchData () kaster SQLException {String SQL_QUERY = "velg * fra emp"; Listeansatte = null; prøv (Connection con = DataSource.getConnection (); PreparedStatement pst = con.prepareStatement (SQL_QUERY); ResultSet rs = pst.executeQuery ();) {ansatte = ny ArrayList (); Ansatt ansatt; mens (rs.next ()) {ansatt = ny ansatt (); ansatte.setEmpNo (rs.getInt ("empno")); ansatte.setEname (rs.getString ("ename")); ansatte.setJob (rs.getString ("jobb")); ansatt.setMgr (rs.getInt ("mgr")); ansatte.setHiredate (rs.getDate ("ansatt")); ansatt.setSal (rs.getInt ("sal")); ansatte.setComm (rs.getInt ("komm")); ansatt.setDeptno (rs.getInt ("deptno")); ansatte. legge til (ansatt); }} returnere ansatte; }

Nå må vi lage en JUnit-metode for å teste den. Siden vi vet antall rader i tabellen emp, kan vi forvente at størrelsen på den returnerte listen skal være lik antall rader:

@Test offentlig ugyldig givenConnection_thenFetchDbData () kaster SQLException {HikariCPDemo.fetchData (); assertEquals (4, ansatte.størrelse ()); }

5. Konklusjon

I denne raske opplæringen lærte vi om fordelene ved å bruke HikariCP og konfigurasjonen.

Som alltid er hele kildekoden tilgjengelig på GitHub.


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