Spring BootはどのようにHikariCP接続池を使いますか?


前言
SpringbootはJavaの開発をより美しく、より簡潔にし、より簡単にします。Spring Boot 2.xではひかりCPをデフォルトのデータ接続池として使用します。HikariCPは、Javassistバイトコードオペレーティングライブラリを使用して動的エージェントを実現し、バイトコードを最適化して簡略化したと同時に、内部ではアラーListの代わりにcom.zaxxer.hikari.util.FastListを使用し、より良いコンポジットクラスcom.zaxxer.hikari.util.ConcurrentBag を使用し、現在最も速いデータベース接続池であると称される。
以下は多く話しません。詳しく紹介してみましょう。
基本的な使い方
Spring Boot 2.xでHikariCPを使うのは非常に簡単で、依存を導入するだけで implementation 'org.springframework.boot:spring-boot-starter-jdbc'

pluginManagement {
	repositories {
		gradlePluginPortal()
	}
}
rootProject.name = 'datasource-config'

plugins {
	id 'org.springframework.boot' version '2.1.3.RELEASE'
	id 'java'
}

apply plugin: 'io.spring.dependency-management'

group = 'spring-boot-guides'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-jdbc'
	runtimeOnly 'com.h2database:h2'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
設定ファイルは以下の通りです。

spring:
 datasource:
 url: jdbc:h2:mem:demodb
 username: sa
 password:
 hikari: # https://github.com/brettwooldridge/HikariCP (uses milliseconds for all time values)
 maximumPoolSize: 10
 minimumIdle: 2
 idleTimeout: 600000
 connectionTimeout: 30000
 maxLifetime: 1800000
接続池の具体的な構成パラメータについてはヒカルのCPを参照してください。
サンプルコードは以下の通りです。

package springbootguides.datasourceconfig;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import javax.sql.DataSource;
import java.sql.Connection;

@SpringBootApplication
public class DatasourceConfigApplication implements CommandLineRunner {

	@Autowired
	private DataSource datasource;

	@Override
	public void run(String... args) throws Exception {
		try(Connection conn = datasource.getConnection()) {
			System.out.println(conn);
		}
	}

	public static void main(String[] args) {
		SpringApplication.run(DatasourceConfigApplication.class, args);
	}

}
原理を実現する
Spring Bootは、HikariCPを統合するための方法を使用しています。入り口はorg.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfigurationで、org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration.Hikariの@Bean方式でcom.zaxxer.hikari.HikariDataSource を作成します。

/**
	 * Hikari DataSource configuration.
	 */
	@ConditionalOnClass(HikariDataSource.class)
	@ConditionalOnMissingBean(DataSource.class)
	@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true)
	static class Hikari {

		@Bean
		@ConfigurationProperties(prefix = "spring.datasource.hikari")
		public HikariDataSource dataSource(DataSourceProperties properties) {
			HikariDataSource dataSource = createDataSource(properties,
					HikariDataSource.class);
			if (StringUtils.hasText(properties.getName())) {
				dataSource.setPoolName(properties.getName());
			}
			return dataSource;
		}

	}
@ConfigurationProperties(prefix = "spring.datasource.hikari") は自動的にspring.datasource.hikari.* に関する接続池構成情報を作成したHikariDataSourceの例に注入する。
HikariCPの監視と遠隔測定
私たちのマイクロサービスシステムで使用されている監視システムはPrometheusであるため、ここではPrometheusを例にしている。
spring boot 2.0はspring boot 1.xのmetricsを再構築し、後方互換性がなくなりました。主にspring-boot-acutatorにmicrometerを使用して、より多くの監視システムをサポートしました。Spring boot 2.0のmetricsは、spring boot 1.xに対してmicrometerを導入する以外に、より大きな表現が支持されています。これはPromtheus、InfluxなどTagをサポートするタイミングモニタリングデータモデルの監視システムが主流となっています。
前の例のbuild.gradleには、次のような依存性が追加されている。

implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'io.micrometer:micrometer-registry-prometheus'
設定ファイルのappycation.yamlにactuatを追加する構成:

management:
 endpoints:
 web:
  exposure:
  include: "health,info,prometheus"
 server:
 port: 8079
 servlet:
  context-path: /
ここでウェブとactuat依存を導入しました。managerment.server.portを配置することによってactuatを指定するウェブの端点は8089ポートで、managerment.endpoints.includeを通じてオープン/actutor/prometheusを設定して、io.micrometerを導入しています。

curl http://localhost:8079/actuator/prometheus | grep hikari
# TYPE hikaricp_connections_acquire_seconds summary
hikaricp_connections_acquire_seconds_count{pool="HikariPool-1",} 3.0
hikaricp_connections_acquire_seconds_sum{pool="HikariPool-1",} 0.001230082
# HELP hikaricp_connections_acquire_seconds_max Connection acquire time
# TYPE hikaricp_connections_acquire_seconds_max gauge
hikaricp_connections_acquire_seconds_max{pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_min Min connections
# TYPE hikaricp_connections_min gauge
hikaricp_connections_min{pool="HikariPool-1",} 2.0
# TYPE hikaricp_connections_timeout_total counter
hikaricp_connections_timeout_total{pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_pending Pending threads
# TYPE hikaricp_connections_pending gauge
hikaricp_connections_pending{pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_usage_seconds Connection usage time
# TYPE hikaricp_connections_usage_seconds summary
hikaricp_connections_usage_seconds_count{pool="HikariPool-1",} 3.0
hikaricp_connections_usage_seconds_sum{pool="HikariPool-1",} 0.06
# HELP hikaricp_connections_usage_seconds_max Connection usage time
# TYPE hikaricp_connections_usage_seconds_max gauge
hikaricp_connections_usage_seconds_max{pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_max Max connections
# TYPE hikaricp_connections_max gauge
hikaricp_connections_max{pool="HikariPool-1",} 10.0
# HELP hikaricp_connections Total connections
# TYPE hikaricp_connections gauge
hikaricp_connections{pool="HikariPool-1",} 2.0
# HELP hikaricp_connections_creation_seconds_max Connection creation time
# TYPE hikaricp_connections_creation_seconds_max gauge
hikaricp_connections_creation_seconds_max{pool="HikariPool-1",} 0.0
# HELP hikaricp_connections_creation_seconds Connection creation time
# TYPE hikaricp_connections_creation_seconds summary
hikaricp_connections_creation_seconds_count{pool="HikariPool-1",} 1.0
hikaricp_connections_creation_seconds_sum{pool="HikariPool-1",} 0.001
# HELP hikaricp_connections_idle Idle connections
# TYPE hikaricp_connections_idle gauge
hikaricp_connections_idle{pool="HikariPool-1",} 2.0
# HELP hikaricp_connections_active Active connections
# TYPE hikaricp_connections_active gauge
hikaricp_connections_active{pool="HikariPool-1",} 0.0
参照
ヒカルのCP
締め括りをつける
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。