HikariCP - データベース接続プール
概要
データベースへの新しい接続の作成には、特に認証がある場合、一定の処理が必要です。
そのため、より大きなパフォーマンス向上を得るには、接続を再利用し、常に新しい接続を開かないようにするのが望ましいです。
この問題を解決するために接続プールが使用されます。接続が破棄されても実際には閉じられて破棄されるわけではなく、新しい接続が必要になったときに再利用できるよう接続が待機状態に置かれます。
これにより大きなパフォーマンス向上が得られ、さらに多くの設定パラメータも利用できます。最もよく知られているのは、データベースの過負荷を避けるために最大接続数を制限することです。
HikariCP
Hikariは日本語で「光」を意味し、Javaアプリケーションで最も効率的かつ広く使用されており、圧倒的に最高のパフォーマンスを誇ることで知られています。
HikariCPの公式リポジトリはGitHubで確認できます。パフォーマンスのグラフと設定に関する情報を確認してください。
NetunoはPostgreSQL、MariaDB、Microsoft SQL Server、Oracleへの接続を管理するためにHikariCPを使用します。
設定
NetunoでのHikariCPの設定は、アプリケーション内のデータベース設定と一緒に行います。
つまり、アプリケーション内のconfigフォルダにある環境設定で、次のようになります。
- _development.json
- _production.json
「db」セクションにデータベース設定が含まれています。
デフォルト接続でもその他の接続でも、HikariCPのパラメータ設定を同じ方法で行えます。
したがって、host、port、name(データベース)、username、passwordがあるdefault内に、次のようにHikariCPのパラメータを追加するだけです。
...
"db": {
"default": {
"engine": "pg",
"host": "localhost",
"port": 5432,
"name": "my_database",
"username": "my_user",
"password": "secret",
"maximumPoolSize": 25,
"minimumIdle": 1,
"idleTimeout": 10000,
"maxLifetime": 60000
}
}
...
たとえば、上記のHikariCPの追加設定はそれぞれ次の目的で使用されます。
maximumPoolSizeはHikariCPの最大接続数を定義します。この例では接続数の上限は25です。minimumIdleは、利用可能になるまで待機キューに置かれる接続の最小数を定義します。idleTimeoutは、接続が待機状態に留まることができる時間です。maxLifetimeは、接続の最大存続時間です。
HikariCPの設定は、データベースエンジンの設定と整合している必要があります。 たとえば、最大接続数やタイムアウト時間は、データベースエンジンで定義されている値を決して超えてはいけません。
その他のHikariCPパラメータも同じ方法で設定できます。希望する設定パラメータを追加するだけです。
パラメータ
以下は、NetunoがHikariCP向けに設定を許可するパラメータの一覧です。
その他のHikariCP設定パラメータは、Netunoによって自動的に事前定義されているか、適用できません。
よく使用されるもの
autoCommit
このプロパティは、プールから返される接続のデフォルトの自動コミット動作を制御します。 ブール値です。
デフォルト: true
connectionTimeout
このプロパティは、クライアント(あなた)がプールから接続を取得するまでに待機する最大時間をミリ秒単位で制御します。接続が利用可能にならないままこの時間を超えると、SQLExceptionがスローされます。許容される最小接続タイムアウトは250 msです。
デフォルト: 30000(30秒)
idleTimeout
このプロパティは、接続がプール内でアイドル状態を維持できる最大時間を制御します。この設定は、minimumIdle が maximumPoolSize より小さく設定されている場合にのみ適用されます。 プールが minimumIdle 接続に達している場合、アイドル接続は削除されません。接続がアイドルとして削除されるかどうかは、最大+30秒、平均+15秒の変動を受けます。接続がこのタイムアウトより前にアイドルとして退役することはありません。値が0の場合、アイドル接続はプールから削除されません。許容される最小値は10000ms(10秒)です。
デフォルト: 600000(10分)
maxLifetime
このプロパティは、プール内の接続の最大寿命を制御します。使用中の接続は決して削除されず、クローズされたときにのみ削除されます。接続ごとに、プール内での一括削除を避けるため、小さな負の減衰が適用されます。この値を設定することを強く推奨します。また、データベースやインフラストラクチャによって課される接続タイムアウトより数秒短くする必要があります。 値が0の場合は最大寿命(無限の期間)を示し、もちろん idleTimeout の設定に従います。許容される最小値は30000ms(30秒)です。
デフォルト: 1800000(30分)
minimumIdle
このプロパティは、HikariCPがプール内で維持しようとするアイドル接続の最小数を制御します。アイドル接続がこの値を下回り、プール内の接続総数が maximumPoolSize より少ない場合、HikariCPは追加の接続を迅速かつ効率的に追加するよう最善を尽くします。ただし、最大のパフォーマンスとピーク需要への応答性を得るには、この値を設定せず、代わりにHikariCPを固定サイズの接続プールとして動作させることを推奨します。
デフォルト: maximumPoolSize と同じ
maximumPoolSize
このプロパティは、アイドル接続と使用中の接続の両方を含め、プールが到達できる最大サイズを制御します。基本的に、この値はバックエンドデータベースへの実際の最大接続数を決定します。これに適した値は、実行環境によって決まります。プールがこのサイズに達し、利用可能なアイドル接続がない場合、getConnection() の呼び出しはタイムアウトするまで最大 connectionTimeout ミリ秒間ブロックされます。
デフォルト: 10
あまり使用されないもの
initializationFailTimeout
このプロパティは、初期接続でプールを正常にシードできない場合に、プールが「フェイルファスト」するかどうかを制御します。正の数は、初期接続の取得を試みるミリ秒数と見なされます。この間、アプリケーションスレッドはブロックされます。この時間内に接続を取得できない場合は、例外がスローされます。このタイムアウトは connectionTimeout の期間後に適用されます。値が0(0)の場合、HikariCPは接続の取得と検証を試みます。接続は取得できたが検証に失敗した場合は例外がスローされ、プールは起動しません。ただし、接続を取得できない場合はプールは起動しますが、その後の接続取得の試みは失敗する可能性があります。0未満の値は初期接続の試行を回避し、バックグラウンドで接続の取得を試みながらプールは直ちに起動します。その結果、その後の接続取得の試みは失敗する可能性があります。
デフォルト: 1
catalog
このプロパティは、カタログの概念をサポートするデータベースのデフォルトカタログを設定します。このプロパティを指定しない場合は、JDBCドライバによって定義されたデフォルトカタログが使用されます。
デフォルト: ドライバのデフォルト
validationTimeout
このプロパティは、接続の有効性をテストする最大時間を制御します。この値は connectionTimeout の時間より小さくする必要があります。許容される最小検証タイムアウトは250 msです。
デフォルト: 5000
leakDetectionThreshold
このプロパティは、接続リークの可能性を示すメッセージが記録される前に、接続がプール外に存在できる時間を制御します。値が0の場合、リーク検出は無効になります。リーク検出を有効にするための許容最小値は2000(2秒)です。
デフォルト: 0
schema
このプロパティは、スキーマの概念をサポートするデータベースのデフォルトスキーマを設定します。このプロパティを指定しない場合は、JDBCドライバによって定義されたデフォルトスキーマが使用されます。
デフォルト: ドライバのデフォルト
DataSource
DataSourceに設定を追加することもできます。つまり、使用中のデータベースの種類に固有の追加設定です。
このより高度な設定を行うには、データベース接続の設定オブジェクト内に datasource 設定オブジェクトを追加する必要があります。
例:
...
"db": {
"default": {
"engine": "mariadb",
"host": "localhost",
"port": 3306,
"name": "my_database",
"username": "my_user",
"password": "secret",
"maximumPoolSize": 25,
"minimumIdle": 1,
"idleTimeout": 10000,
"maxLifetime": 60000,
"datasource": {
"cachePrepStmts": "true",
"prepStmtCacheSize": 250,
"prepStmtCacheSqlLimit": 2048
}
}
}
...
DataSourceパラメータ設定の値は string 型であることに注意してください。いずれにしてもNetunoは常に自動的に string に変換します。
まとめ
HikariCPを使用することで、データベース接続の負荷と動作を管理するための高度な設定が可能になります。
さまざまなシナリオに最適化でき、高いパフォーマンスを確保できます。