可觀測(cè)性-Metrics-數(shù)據(jù)庫(kù)連接池HikariCP監(jiān)控教程
非SpringBoot環(huán)境
HikariCP其內(nèi)部提供了setMetricRegistry()方法,讓我們可以注入MetricRegistry來(lái)實(shí)現(xiàn)對(duì)連接池指標(biāo)的收集。
這樣我們可以較為方便的監(jiān)控連接池的運(yùn)行狀態(tài)。
添加依賴
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-core</artifactId>
<version>1.9.4</version>
</dependency>示例
// hikari配置
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/laker?serverTimezone=GMT%2B8&characterEncoding=utf8&useSSL=false");
hikariConfig.setUsername("root");
hikariConfig.setPassword("123456");
hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
hikariConfig.setAutoCommit(true);
hikariConfig.setPoolName("laker_poolName");
hikariConfig.setMaximumPoolSize(10);
hikariConfig.setMinimumIdle(3);
// 創(chuàng)建HikariDataSource
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
// 設(shè)置metric注冊(cè)器 每10秒打印一次
LoggingMeterRegistry loggingMeterRegistry = new LoggingMeterRegistry(new LoggingRegistryConfig() {
@Override
public String get(String key) {
return null;
}
@Override
public Duration step() {
return Duration.ofSeconds(10);
}
}, Clock.SYSTEM);
dataSource.setMetricRegistry(loggingMeterRegistry);
// 測(cè)試 持有3秒連接后才釋放
Connection connection = dataSource.getConnection();
TimeUnit.SECONDS.sleep(3);
connection.close();結(jié)果:
hikaricp.connections{pool=laker_poolName} value=4
hikaricp.connections.active{pool=laker_poolName} value=1
hikaricp.connections.idle{pool=laker_poolName} value=3
hikaricp.connections.max{pool=laker_poolName} value=10
hikaricp.connections.min{pool=laker_poolName} value=3
hikaricp.connections.pending{pool=laker_poolName} value=0
hikaricp.connections.acquire{pool=laker_poolName} throughput=0.1/s mean=0.0000581s max=0.0000581s
hikaricp.connections.creation{pool=laker_poolName} throughput=0.3/s mean=0.006666666s max=0.007s
hikaricp.connections.usage{pool=laker_poolName} throughput=0.1/s mean=3.017s max=3.017s
指標(biāo)詳解
對(duì)應(yīng)的指標(biāo)在com.zaxxer.hikari.metrics.PoolStats中。
| 指標(biāo) | 詳解 |
|---|---|
| hikaricp.connections | 當(dāng)前總連接數(shù),包括空閑的連接和使用中的連接。(4 = 3 + 1)對(duì)應(yīng)上面日志; Connections = activeConnection + idleConnections,會(huì)隨著連接使用情況變化。 |
| hikaricp.connections.active | 正在使用中活躍連接數(shù) (1),會(huì)隨著連接使用情況變化。 |
| hikaricp.connections.idle | 空閑連接數(shù) (3) ,會(huì)隨著連接使用情況變化。 |
| hikaricp.connections.max | 最大連接數(shù) (10),初始配置。 |
| hikaricp.connections.min | 最小連接數(shù) (3),初始配置。 |
| hikaricp.connections.pending | 正在等待連接的線程數(shù)量(0)。重點(diǎn):一般來(lái)說(shuō),這里應(yīng)該都是0,如果存在這個(gè)數(shù)據(jù)并且時(shí)間較長(zhǎng)要觸發(fā)告警,視情況加大最大連接數(shù)。 |
| hikaricp.connections.acquire | 獲取每個(gè)連接需要時(shí)間,單位為ns。 |
| hikaricp.connections.creation | 連接創(chuàng)建時(shí)間,單位為ms。 |
| hikaricp.connections.timeout | 創(chuàng)建連接超時(shí)次數(shù)。 |
| hikaricp.connections.usage | 連接從池中取出到返回的時(shí)間,單位為ms。即連接被業(yè)務(wù)占用時(shí)間(3.017s)。重點(diǎn):這個(gè)時(shí)間長(zhǎng)的話, 可能是慢SQL或者長(zhǎng)事務(wù)導(dǎo)致連接被占用問(wèn)題。 |
Spring Boot環(huán)境
手動(dòng)
還是添加上面的依賴組件。
@Configuration
public class DatasourceConfiguration {
@Bean
public DataSource primaryDataSource(MetricRegistry metricRegistry) {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/laker?serverTimezone=GMT%2B8&characterEncoding=utf8&useSSL=false");
hikariConfig.setUsername("root");
hikariConfig.setPassword("123456");
hikariConfig.setDriverClassName("com.mysql.jdbc.Driver");
hikariConfig.setAutoCommit(true);
hikariConfig.setPoolName("laker_poolName");
hikariConfig.setMaximumPoolSize(10);
hikariConfig.setMinimumIdle(3);
// 創(chuàng)建HikariDataSource
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
dataSource.setMetricRegistry(loggingMeterRegistry);
return dataSource;
}
}自動(dòng)
只需要添加如下依賴,內(nèi)部會(huì)自動(dòng)加上HikariCP和micrometer-core依賴,并自動(dòng)配置注冊(cè)器。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>原理,我們可以看這個(gè)類(lèi)DataSourcePoolMetricsAutoConfiguration.java

關(guān)于Sql日志記錄和慢日志
可以看這個(gè)Issue:https://github.com/brettwooldridge/HikariCP/issues/57#issuecomment-354647631
作者是不愿意在連接池層去做這種監(jiān)控的事情的,應(yīng)為會(huì)大大降低其性能。
注意:
- Sql記錄功能會(huì)導(dǎo)致性能下降,所以建議僅能用于開(kāi)發(fā)、測(cè)試環(huán)境。
- 慢日志可以考慮通過(guò)事件類(lèi)型,發(fā)送事件用于告警,關(guān)聯(lián)更多的上下文,在ORM層去做,例如在Mybatis的攔截器做。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解mybatis-plus使用@EnumValue注解的方式對(duì)枚舉類(lèi)型的處理
這篇文章主要介紹了詳解mybatis-plus使用@EnumValue注解的方式對(duì)枚舉類(lèi)型的處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Springcloud中的Nacos?Config服務(wù)配置流程分析
這篇文章主要介紹了Springcloud中的Nacos?Config服務(wù)配置,本文以用戶微服務(wù)為例,進(jìn)行統(tǒng)一的配置,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09
Spring-AOP @AspectJ切點(diǎn)函數(shù)之@annotation()用法
這篇文章主要介紹了Spring-AOP @AspectJ切點(diǎn)函數(shù)之@annotation()用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java利用Spire.Doc for Java實(shí)現(xiàn)在模板的基礎(chǔ)上創(chuàng)建Word文檔
在日常開(kāi)發(fā)中,我們經(jīng)常需要根據(jù)特定數(shù)據(jù)動(dòng)態(tài)生成Word文檔,本文將深入探討如何利用強(qiáng)大的Java庫(kù) Spire.Doc for Java,在預(yù)設(shè)Word模板的基礎(chǔ)上,通過(guò)替換占位符或書(shū)簽來(lái)高效創(chuàng)建定制化的Word文檔,感興趣的小伙伴可以了解下2025-12-12
JAVA 實(shí)現(xiàn)二叉樹(shù)(鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu))
本篇文章主要介紹用JAVA 實(shí)現(xiàn)二叉樹(shù),并提供實(shí)例.對(duì)二叉樹(shù)數(shù)據(jù)結(jié)構(gòu)很好的學(xué)習(xí)實(shí)踐,有需要的朋友可以參考下2016-07-07
java 利用反射獲取內(nèi)部類(lèi)靜態(tài)成員變量的值操作
這篇文章主要介紹了java 利用反射獲取內(nèi)部類(lèi)靜態(tài)成員變量的值操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Java CRM系統(tǒng)用戶登錄功能實(shí)現(xiàn)代碼實(shí)例
這篇文章主要介紹了Java CRM系統(tǒng)用戶登錄功能實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
Idea 同一窗口導(dǎo)入多個(gè)項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了Idea 同一窗口導(dǎo)入多個(gè)項(xiàng)目的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07

