非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è)類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)境。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-460866.html
慢日志可以考慮通過(guò)事件類型,發(fā)送事件用于告警,關(guān)聯(lián)更多的上下文,在ORM層去做,例如在Mybatis的攔截器做。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-460866.html
到了這里,關(guān)于可觀測(cè)性-Metrics-數(shù)據(jù)庫(kù)連接池HikariCP監(jiān)控的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!