Pengenalan HikariCP

1. Gambaran keseluruhan

Dalam artikel pengantar ini, kita akan belajar mengenai projek kumpulan sambungan HikariCP JDBC. Ini adalah kerangka penyambungan sambungan JDBC yang sangat ringan (sekitar 130Kb) dan sepantas kilat yang dikembangkan oleh Brett Wooldridge sekitar tahun 2012.

2. Pengenalan

Terdapat beberapa hasil penanda aras yang tersedia untuk membandingkan prestasi HikariCP dengan kerangka penyatuan sambungan lain seperti c3p0 , dbcp2 , tomcat , dan vibur . Sebagai contoh, pasukan HikariCP menerbitkan tanda aras di bawah (hasil asal boleh didapati di sini):

Kerangka kerja begitu cepat kerana teknik berikut telah diterapkan:

  • Kejuruteraan tahap bytecode - beberapa teknik tahap bytecode yang melampau (termasuk pengkodan asli peringkat pemasangan) telah dilakukan
  • Pengoptimuman mikro - walaupun hampir tidak dapat diukur, pengoptimuman ini digabungkan meningkatkan prestasi keseluruhan
  • Penggunaan bijak rangka kerja Collections itu - yang ArrayList telah digantikan dengan kelas adat senarai pantas yang menghapuskan julat memeriksa dan melakukan penyingkiran imbasan dari ekor ke kepala

3. Ketergantungan Maven

Mari buat contoh aplikasi untuk menyoroti penggunaannya. HikariCP hadir dengan sokongan untuk semua versi utama JVM. Setiap versi memerlukan kebergantungannya; untuk Java 8 hingga 11, kami mempunyai:

 com.zaxxer HikariCP 3.4.5 

Versi JDK lama seperti 6 dan 7 juga disokong. Versi yang sesuai boleh didapati di sini dan di sini. Juga, kita dapat memeriksa versi terbaru di Central Maven Repository.

4. Penggunaan

Mari sekarang buat aplikasi demo. Harap maklum bahawa kami perlu memasukkan kebergantungan kelas pemacu JDBC yang sesuai dalam pom.xml . Sekiranya tidak ada pergantungan yang disediakan, aplikasi akan membuang ClassNotFoundException .

4.1. Membuat Sumber Data

Kami akan menggunakan DataSource HikariCP untuk membuat satu contoh sumber data untuk aplikasi kami:

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

Yang perlu diperhatikan di sini adalah permulaan dalam blok statik .

HikariConfig adalah kelas konfigurasi yang digunakan untuk menginisialisasi sumber data. Ia dilengkapi dengan empat parameter nama pengguna , kata laluan , jdbcUrl , dataSourceClassName yang mesti digunakan .

Di luar jdbcUrl dan dataSourceClassName , salah satu daripadanya akan digunakan pada satu masa. Namun, apabila menggunakan harta ini dengan pemacu yang lebih lama, kita mungkin perlu menetapkan kedua-dua sifat tersebut.

Sebagai tambahan kepada hartanah ini, terdapat beberapa hartanah lain yang mungkin tidak semua ditawarkan oleh kerangka penyatuan lain:

  • AutoCommit
  • masa sambungan telah tamat
  • idleTimeout
  • maxLifetime
  • sambunganTestQuery
  • sambunganInitSql
  • pengesahanTimeout
  • maksimumPoolSize
  • nama kolam
  • izinkanPoolSuspension
  • baca sahaja
  • urus niaga Pengasingan
  • kebocoranDetectionThreshold

HikariCP menonjol kerana sifat pangkalan data ini. Ia cukup maju untuk mengesan kebocoran sambungan dengan sendirinya!

Penerangan terperinci mengenai sifat-sifat ini boleh didapati di sini.

Kami juga dapat menginisialisasi HikariConfig dengan fail sifat yang ditempatkan di direktori sumber :

private static HikariConfig config = new HikariConfig( "datasource.properties" );

Fail harta tanah kelihatan seperti ini:

dataSourceClassName= //TBD dataSource.user= //TBD //other properties name should start with dataSource as shown above

Kita boleh menggunakan konfigurasi berasaskan java.util.Properties juga:

Properties props = new Properties(); props.setProperty( "dataSourceClassName" , //TBD ); props.setProperty( "dataSource.user" , //TBD ); //setter for other required properties private static HikariConfig config = new HikariConfig( props );

Sebagai alternatif, kita dapat menginisialisasi sumber data secara langsung:

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

4.2. Menggunakan Sumber Data

Sekarang setelah kita menentukan sumber data, kita dapat menggunakannya untuk mendapatkan sambungan dari kumpulan sambungan yang dikonfigurasi dan melakukan tindakan yang berkaitan dengan JDBC.

Katakan kita mempunyai dua jadual bernama dept dan emp untuk mensimulasikan kes penggunaan jabatan pekerja. Kami akan menulis kelas untuk mengambil butiran tersebut dari pangkalan data menggunakan HikariCP.

Di bawah ini kami senaraikan pernyataan SQL yang diperlukan untuk membuat sampel data:

create table dept( deptno numeric, dname varchar(14), loc varchar(13), constraint pk_dept primary key ( deptno ) ); create table emp( empno numeric, ename varchar(10), job varchar(9), mgr numeric, hiredate date, sal numeric, comm numeric, deptno numeric, constraint pk_emp primary key ( empno ), constraint fk_deptno foreign key ( deptno ) references dept ( deptno ) ); insert into dept values( 10, 'ACCOUNTING', 'NEW YORK' ); insert into dept values( 20, 'RESEARCH', 'DALLAS' ); insert into dept values( 30, 'SALES', 'CHICAGO' ); insert into dept values( 40, 'OPERATIONS', 'BOSTON' ); insert into emp values( 7839, 'KING', 'PRESIDENT', null, to_date( '17-11-1981' , 'dd-mm-yyyy' ), 7698, null, 10 ); insert into emp values( 7698, 'BLAKE', 'MANAGER', 7839, to_date( '1-5-1981' , 'dd-mm-yyyy' ), 7782, null, 20 ); insert into emp values( 7782, 'CLARK', 'MANAGER', 7839, to_date( '9-6-1981' , 'dd-mm-yyyy' ), 7566, null, 30 ); insert into emp values( 7566, 'JONES', 'MANAGER', 7839, to_date( '2-4-1981' , 'dd-mm-yyyy' ), 7839, null, 40 );

Harap diperhatikan jika kita menggunakan pangkalan data dalam memori seperti H2, kita perlu memuatkan skrip pangkalan data secara automatik sebelum menjalankan kod sebenarnya untuk mengambil data. Syukurlah, H2 dilengkapi dengan parameter INIT yang dapat memuatkan skrip pangkalan data dari classpath pada waktu runtime. URL JDBC akan kelihatan seperti:

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

Kita perlu membuat kaedah untuk mengambil data ini dari pangkalan data:

public static List fetchData() throws SQLException { String SQL_QUERY = "select * from emp"; List employees = null; try (Connection con = DataSource.getConnection(); PreparedStatement pst = con.prepareStatement( SQL_QUERY ); ResultSet rs = pst.executeQuery();) { employees = new ArrayList(); Employee employee; while ( rs.next() ) { employee = new Employee(); employee.setEmpNo( rs.getInt( "empno" ) ); employee.setEname( rs.getString( "ename" ) ); employee.setJob( rs.getString( "job" ) ); employee.setMgr( rs.getInt( "mgr" ) ); employee.setHiredate( rs.getDate( "hiredate" ) ); employee.setSal( rs.getInt( "sal" ) ); employee.setComm( rs.getInt( "comm" ) ); employee.setDeptno( rs.getInt( "deptno" ) ); employees.add( employee ); } } return employees; }

Sekarang, kita perlu membuat kaedah JUnit untuk mengujinya. Oleh kerana kita mengetahui bilangan baris dalam tabel emp , kita dapat menjangkakan bahawa ukuran senarai yang dikembalikan harus sama dengan jumlah baris:

@Test public void givenConnection_thenFetchDbData() throws SQLException { HikariCPDemo.fetchData(); assertEquals( 4, employees.size() ); }

5. Kesimpulan

Dalam tutorial ringkas ini, kami mengetahui tentang faedah menggunakan HikariCP dan konfigurasinya.

Seperti biasa, kod sumber penuh tersedia di GitHub.