1概要

この紹介記事では、https://brettwooldridge.github.io/HikariCP/[HikariCP JDBC]接続プールプロジェクトについて学びます。 ** これは、非常に軽量(約130Kb)で、2012年頃にhttps://github.com/brettwooldridge[Bret Wooldridge]によって開発された、非常に軽量で高速なJDBC接続プールフレームワークです。

** 2前書き

**

HikariCPのパフォーマンスを


c3p0





https://commons.apache.org/proper/などの他の接続プーリングフレームワークと比較するためのベンチマーク結果がいくつかあります。

commons-dbcp/[dbcp2]




tomcat


、およびhttp://www.vibur.org/[

vibur

]。たとえば、HikariCPチームは以下のベンチマークを公開しました(元の結果はhttps://github.com/brettwooldridge/HikariCP-benchmark[here]から入手できます)。


image、width = 864、height = 362

以下のテクニックが適用されているので、フレームワークはとても速いです。


  • バイトコードレベルのエンジニアリング –

    いくつかの極端なバイトコードレベルのエンジニアリング

(アセンブリレベルのネイティブコーディングを含む)行われている


マイクロ最適化 – ** ほとんど測定できないものの、これら

最適化の組み合わせにより、全体的なパフォーマンスが向上します


Collectionsフレームワークのインテリジェントな使用 – ** the


ArrayList <Statement>

は範囲チェックを排除し、末尾から頭への削除スキャンを実行するカスタムクラス

FastList

に置き換えられました。

** 3メーベン依存

**

使い方を強調するためのサンプルアプリケーションを作成しましょう。 HikariCPは、JVMのすべての主要バージョンをサポートしています。各バージョンには依存関係が必要です。 Java 9では、次のものがあります。

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP-java9ea</artifactId>
    <version>2.6.1</version>
</dependency>

そしてJava 8の場合:

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

6や7などの古いJDKバージョンもサポートされています。適切なバージョンはhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.zaxxer%22%20AND%20a%3A%22HikariCP-java7%22[ここ]およびhttps://search.maven.org/classic/#search%7Cgav%7C1%7Cg%3A%22com.zaxxer%22%20AND%20a%3A%22HikariCP-java6%22[here]。

また、https://search.maven.org/classic/#search%7C1%7Cg%3A%22com.zaxxer%22%20AND%20a%3A%22HikariCP%22[Centralで最新バージョンを確認することもできます。 Mavenリポジトリ]。

** 4使用法

**

それではデモアプリケーションを作成しましょう。

pom.xml

に適切なJDBCドライバクラスの依存関係を含める必要があることに注意してください。依存関係が提供されていない場合、アプリケーションは

ClassNotFoundException

をスローします。


4.1.

DataSource


を作成する

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

ここで注意すべき点は、

static

ブロック内の初期化です。


https://github.com/openbouquet/HikariCP/blob/master/src/main/java/com/zax

xer/hikari/HikariConfig.java[HikariConfig]は、データソースを初期化するために使用される設定クラスです。これには、よく使用される4つの必須パラメーター

username



password



jdbcUrl

、および

dataSourceClassName

が付属しています。


jdbcUrl



dataSourceClassName

のうち、どちらか一方を同時に使用します。ただし、古いドライバでこのプロパティを使用する場合は、両方のプロパティを設定する必要があります。

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


  • 自動コミット


  • connectionTimeout


  • idleTimeout


  • maxLifetime


  • connectionTestQuery


  • connectionInitSql


  • validationTimeout


  • 最大プールサイズ


  • poolName


  • allowPoolSuspension


  • readOnly


  • トランザクショントランザクション


  • leakDetectionThreshold

HikariCPはこれらのデータベース特性のために際立っています。それ自体で接続リークを検出することさえできるほど十分に進んでいます!

これらのプロパティの詳細な説明はhttps://github.com/brettwooldridge/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関連のアクションを実行できます。

従業員部門のユースケースをシミュレートするために


dept





emp


という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

パラメータが付属しています。 JDBC URLは次のようになります。

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を使用する利点とその設定について学びました。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/libraries-data[GitHubで利用可能]です。