Uvod u HikariCP

1. Pregled

U ovom uvodnom članku saznat ćemo o projektu spremišta HikariCP JDBC. Ovo je vrlo lagan (otprilike 130Kb) i brzi JDBC okvir za udruživanje veza razvio Brett Wooldridge oko 2012. godine.

2. Uvod

Dostupno je nekoliko referentnih rezultata za usporedbu izvedbe HikariCP-a s drugim okvirima za spremanje veza, kao što je c3p0, dbcp2, mačak, i vibur. Na primjer, tim HikariCP objavio je dolje referentne vrijednosti (ovdje su dostupni izvorni rezultati):

Okvir je tako brz jer su primijenjene sljedeće tehnike:

  • Inženjering na razini bajtkoda - napravljeno je neko ekstremno inženjerstvo na razini bajt-koda (uključujući nativno kodiranje na razini sklopa)
  • Mikro-optimizacije - iako jedva mjerljive, ove optimizacije u kombinaciji povećavaju ukupne performanse
  • Inteligentno korištenje okvira Zbirke - the ArrayList zamijenjen je prilagođenom klasom FastList koji eliminira provjeru dometa i vrši skeniranje uklanjanja od repa do glave

3. Ovisnost Mavena

Izgradimo uzorak aplikacije kako bismo istakli njezinu upotrebu. HikariCP dolazi s podrškom za sve glavne verzije JVM-a. Svaka verzija zahtijeva svoju ovisnost; za Javu od 8 do 11 imamo:

 com.zaxxer HikariCP 3.4.5 

Podržane su i starije verzije JDK poput 6 i 7. Odgovarajuće verzije možete pronaći ovdje i ovdje. Također, najnovije verzije možemo provjeriti u središnjem spremištu Maven.

4. Upotreba

Stvorimo sada demo aplikaciju. Napominjemo da moramo uključiti odgovarajuću ovisnost o klasi JDBC upravljačkog programa u pom.xml. Ako nisu osigurane ovisnosti, aplikacija će baciti a ClassNotFoundException.

4.1. Stvaranje a Izvor podataka

Koristit ćemo HikariCP-ove Izvor podataka za stvaranje jedinstvene instance izvora podataka za našu aplikaciju:

javna klasa DataSource {private static HikariConfig config = new HikariConfig (); privatni statički HikariDataSource ds; statički {config.setJdbcUrl ("jdbc_url"); config.setUsername ("username_username"); config.setPassword ("password_password"); config.addDataSourceProperty ("cachePrepStmts", "true"); config.addDataSourceProperty ("prepStmtCacheSize", "250"); config.addDataSourceProperty ("prepStmtCacheSqlLimit", "2048"); ds = novi HikariDataSource (konfiguracija); } private DataSource () {} javna statička veza getConnection () baca SQLException {return ds.getConnection (); }}

Ovdje valja napomenuti da je inicijalizacija u statički blok.

HikariConfig je konfiguracijska klasa koja se koristi za inicijalizaciju izvora podataka. Dolazi s četiri dobro poznata parametra Korisničko ime, zaporka, jdbcUrl, dataSourceClassName.

Od jdbcUrl i dataSourceClassName, bilo koji od njih će se koristiti odjednom. Međutim, kada koristimo ovo svojstvo sa starijim upravljačkim programima, možda ćemo morati postaviti oba svojstva.

Pored ovih svojstava, dostupno je još nekoliko svojstava koja svi okviri za udruživanje možda ne nude sve:

  • autoCommit
  • vrijeme povezanosti je isteklo
  • idleTimeout
  • maxLifetime
  • connectionTestQuery
  • connectionInitSql
  • validationTimeout
  • maximumPoolSize
  • poolName
  • allowPoolSuspension
  • samo za čitanje
  • transakcijaIzolacija
  • leakDetectionThreshold

HikariCP se ističe zbog ovih svojstava baze podataka. Dovoljno je napredan da čak i sam otkrije curenje veze!

Detaljan opis ovih svojstava možete pronaći ovdje.

Također možemo inicijalizirati HikariConfig s datotekom svojstava smještenom u resursi imenik:

privatni statički HikariConfig config = novi HikariConfig ("datasource.properties");

Datoteka svojstava trebala bi izgledati otprilike ovako:

dataSourceClassName = // TBD dataSource.user = // TBD // naziv ostalih svojstava trebao bi počinjati s dataSource kao što je gore prikazano

Možemo koristiti java.util.Properties-temeljena i na konfiguraciji:

Osobine svojstva = novi Svojstva (); props.setProperty ("dataSourceClassName", // TBD); props.setProperty ("dataSource.user", // TBD); // postavljač za ostala potrebna svojstva private static HikariConfig config = new HikariConfig (rekviziti);

Alternativno, izvor podataka možemo inicijalizirati izravno:

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

4.2. Korištenje izvora podataka

Sad kad smo definirali izvor podataka, možemo ga koristiti za dobivanje veze iz konfiguriranog spremišta veza i izvođenje radnji povezanih s JDBC-om.

Pretpostavimo da imamo dvije imenovane tablice dubina i emp za simulaciju slučaja upotrebe službenika. Napisat ćemo klasu za dohvaćanje tih podataka iz baze podataka pomoću HikariCP-a.

U nastavku navodimo SQL izjave potrebne za stvaranje uzoraka podataka:

stvoriti odjeljak tablice (deptno numerički, dname varchar (14), loc varchar (13), ograničenje primarni ključ pk_dept (deptno)); izradi tablicu emp (empno numerički, ename varchar (10), posao varchar (9), mgr numerički, datum angažiranja, sal numerički, comm numeric, deptno numerički, ograničenje pk_emp primarni ključ (empno), ograničenje fk_deptno strani ključ (deptno) reference odjel (deptno)); umetnite u vrijednosti odsjeka (10, 'RAČUNOVODSTVO', 'NEW YORK'); umetnuti u vrijednosti odsjeka (20, 'ISTRAŽIVANJE', 'DALLAS'); umetnite u vrijednosti odsjeka (30, 'PRODAJA', 'CHICAGO'); umetnite u vrijednosti odsjeka (40, 'OPERATIONS', 'BOSTON'); umetni u vrijednosti emp (7839, 'KING', 'PRESIDENT', null, to_date ('17 -11-1981 ',' dd-mm-yyyy '), 7698, null, 10); umetni u vrijednosti emp (7698, 'BLAKE', 'MANAGER', 7839, to_date ('1-5-1981', 'dd-mm-yyyy'), 7782, null, 20); umetni u vrijednosti emp (7782, 'CLARK', 'MANAGER', 7839, to_date ('9-6-1981', 'dd-mm-yyyy'), 7566, null, 30); umetni u vrijednosti emp (7566, 'JONES', 'MANAGER', 7839, to_date ('2-4-1981', 'dd-mm-yyyy'), 7839, null, 40);

Imajte na umu da ako koristimo bazu podataka u memoriji kao što je H2, trebamo automatski učitati skriptu baze podataka prije pokretanja stvarnog koda za dohvaćanje podataka. Srećom, H2 dolazi s U TOME parametar koji u vrijeme izvođenja može učitati skriptu baze podataka iz classpath-a. URL JDBC trebao bi izgledati ovako:

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

Moramo stvoriti metodu za dohvaćanje ovih podataka iz baze podataka:

javni statički popis fetchData () baca SQLException {String SQL_QUERY = "select * from emp"; Popis zaposlenika = null; probajte (Veza con = DataSource.getConnection (); PreparedStatement pst = con.prepareStatement (SQL_QUERY); ResultSet rs = pst.executeQuery ();) {zaposlenici = novi ArrayList (); Zaposlenik zaposlenik; while (rs.next ()) {zaposlenik = novi zaposlenik (); zaposlenik.setEmpNo (rs.getInt ("empno")); zaposlenik.setEname (rs.getString ("ename")); worker.setJob (rs.getString ("posao")); zaposlenik.setMgr (rs.getInt ("mgr")); worker.setHiredate (rs.getDate ("unajmljen")); zaposlenik.setSal (rs.getInt ("sal")); zaposlenik.setComm (rs.getInt ("comm")); worker.setDeptno (rs.getInt ("deptno")); zaposlenici.add (zaposlenik); }} vratiti zaposlenike; }

Sada moramo stvoriti JUnit metodu da bismo je testirali. Budući da znamo broj redaka u tablici emp, možemo očekivati ​​da bi veličina vraćenog popisa trebala biti jednaka broju redaka:

@Test javna praznina givenConnection_thenFetchDbData () baca SQLException {HikariCPDemo.fetchData (); assertEquals (4, zaposlenici.size ()); }

5. Zaključak

U ovom smo brzom vodiču saznali o prednostima korištenja HikariCP-a i njegovoj konfiguraciji.

Kao i uvijek, puni izvorni kod dostupan je na GitHub-u.