HikariCPは人気のあるコネクションプールライブラリの一つです

Spring Bootからも簡単に使えるようになっています

こんな感じ

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class AppConfig {

    @Bean(destroyMethod = "close")
    public DataSource dataSource() {
        final HikariDataSource ds = new HikariDataSource();
        ds.setDriverClassName(driverClassName);
        ds.setJdbcUrl(jdbcUrl);
        ds.setUsername(userName);
        ds.setPassword(password);
        return ds;
    }
}

コネクションプールのベンチマークは以前取りました。ご参考まで

Spring Bootのコネクションプーリングの比較



コネクションプールを使うとJMXでMetricsを取りたくなりますよね?

HikariCPにはその機能がちゃんとあります

MBean (JMX) Monitoring and Management



以下の2つを設定すればコネクションプールのMBeanが登録されます

  • registerMbeans
  • poolName

ですが、Springと一緒に使う場合この設定をしただけではコネクションプールのMBeanが登録されませんでした

こんな感じでDataSourceの一部の設定しか取れず、肝心のコネクションプールのMetricsはわからない状態になってます

なんでコネクションプールのMBeanが登録されてないかと言うと、
アプリケーション起動時にSpringがコンポーネントの中からMBeanを探して登録してるからです

HikariCPのDataSource(HikariDataSource)はコンポーネントとして登録されてるけど、
コネクションプール(HikariPool)はコンポーネントとして登録されてません



Springのソースコードの該当箇所は以下です

  1. Spring BootのJmxAutoConfigurationでMBeanExporterが無ければ、AnnotationMBeanExporterのコンポーネントが生成される

  2. AnnotationMBeanExporterの親クラスであるMBeanExporterのメソッドでMBeanに登録される



では、どうすればコネクションプールのMBeanを登録してMetricsが取れるようになるかというと、

MBeanの登録はSpringでは行わず、HikariCPにまかせればOKです

具体的なソースコードは以下になります

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
@Configuration
public class AppConfig {

    // 追加
    @Autowired
    MBeanExporter mBeanExporter;

    @Bean(destroyMethod = "close")
    public DataSource dataSource() {
        final HikariDataSource ds = new HikariDataSource();
        ds.setDriverClassName(driverClassName);
        ds.setJdbcUrl(jdbcUrl);
        ds.setUsername(userName);
        ds.setPassword(password);

        // 追加
        ds.setRegisterMbeans(true);
        ds.setPoolName("dataSource");

        // 追加
        // Bean名を指定する
        // (Beanアノテーションのname属性 or Beanアノテーションを付けたメソッド名)
        mBeanExporter.addExcludedBean("dataSource");

        return ds;
    }
}

MBeanExporterのexcludedBeansにコンポーネント名を追加しておけば、ここでMBean登録対象から除外される様になってます



設定後はこんな感じでコネクションプールのMetricsが取れます



Metricsを取得するためのObjectNameはこれです

com.zaxxer.hikari:type=Pool (データソース名)

参考URL

HikariCP のステータスを JMX 経由で取得する