1. 概要

この入門チュートリアルでは、 HikariCP JDBC 接続プールプロジェクトについて学習します。これは、によって開発された非常に軽量(約130Kb)で超高速のJDBC接続プールフレームワークです。 X222X]ブレットウールドリッジ2012年頃。

2. 序章

HikariCPのパフォーマンスを、 c3p0 dbcp2 tomcat vibur [ X196X]。 たとえば、HikariCPチームは、以下のベンチマークを公開しました(元の結果はここで入手可能)。

次の手法が適用されているため、フレームワークは非常に高速です。

  • バイトコードレベルのエンジニアリング– いくつかの極端なバイトコードレベルのエンジニアリング(アセンブリレベルのネイティブコーディングを含む)が実行されました
  • マイクロ最適化– ほとんど測定できませんが、これらの最適化を組み合わせると、全体的なパフォーマンスが向上します
  • コレクションフレームワークのインテリジェントな使用– the 配列リストカスタムクラスに置き換えられました、 FastList、 範囲チェックを排除し、頭から尾まで除去スキャンを実行します

3. Mavenの依存関係

まず、サンプルアプリケーションを作成して、その使用法を強調しましょう。 HikariCPには、JVMのすべてのメインバージョンがサポートされています。 各バージョンには依存関係が必要です。 Java 8から11の場合、次のようになります。

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.4.5</version>
</dependency>

HikariCPは、6や7などの古いバージョンのJDKもサポートしています。 適切なバージョンは、それぞれherehereにあります。 CentralMavenリポジトリで最新バージョンを確認することもできます。

4. 使用法

これで、デモアプリケーションを作成できます。 pom.xmlに適切なJDBCドライバークラスの依存関係を含める必要があることに注意してください。 依存関係が提供されていない場合、アプリケーションはClassNotFoundExceptionをスローします。

4.1. データソースの作成

HikariCPのDataSourceを使用して、アプリケーションのデータソースの単一インスタンスを作成します。

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

ここで注意すべき点の1つは、staticブロックでの初期化です。

HikariConfig は、データソースを初期化するために使用される構成クラスです。 これには、 username password jdbcUrl 、およびdataSourceClassNameの4つのよく知られた必須パラメーターが付属しています。

jdbcUrldataSourceClassNameのうち、通常は一度に1つずつ使用します。 ただし、このプロパティを古いドライバで使用する場合は、両方のプロパティを設定する必要がある場合があります。

これらのプロパティに加えて、他のプーリングフレームワークでは提供されていない可能性のある他のいくつかのプロパティが利用可能です。

  • autoCommit
  • connectionTimeout
  • idleTimeout
  • maxLifetime
  • connectionTestQuery
  • connectionInitSql
  • 検証タイムアウト
  • maximumPoolSize
  • poolName
  • allowPoolSuspension
  • 読み取り専用
  • transactionIsolation
  • LeakDetectionThreshold

HikariCPは、これらのデータベースプロパティのために際立っています。 それ自体で接続リークを検出するのに十分なほど高度です。

上記のプロパティの詳細な説明は、ここにあります。

resources ディレクトリに配置されたプロパティファイルを使用して、HikariConfigを初期化することもできます。

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

プロパティファイルは次のようになります。

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

さらに、java.util.Properties-ベースの構成を使用できます。

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

または、データソースを直接初期化することもできます。

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

4.2. データソースの使用

データソースを定義したので、それを使用して、構成された接続プールから接続を取得し、JDBC関連のアクションを実行できます。

従業員部門のユースケースをシミュレートするために、 deptemp、という名前の2つのテーブルがあるとします。 HikariCPを使用して、データベースからこれらの詳細をフェッチするクラスを作成します。

以下に、サンプルデータの作成に必要なSQLステートメントを示します。

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

H2などのインメモリデータベースを使用する場合は、実際のコードを実行してデータをフェッチする前に、データベーススクリプトを自動的にロードする必要があることに注意してください。 ありがたいことに、H2には INIT パラメータが付属しており、実行時にクラスパスからデータベーススクリプトをロードできます。 JDBCURLは次のようになります。

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

データベースからこのデータをフェッチするメソッドを作成する必要があります。

public static List<Employee> fetchData() throws SQLException {
    String SQL_QUERY = "select * from emp";
    List<Employee> 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;
}

次に、それをテストするためのJUnitメソッドを作成する必要があります。 テーブルempの行数がわかっているので、返されるリストのサイズは行数と同じであると予想できます。

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

5. 結論

この短い記事では、HikariCPを使用する利点とその構成について学びました。

いつものように、完全なソースコードはGitHubから入手できます。