最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

可觀測(cè)性-Metrics-數(shù)據(jù)庫(kù)連接池HikariCP監(jiān)控教程

 更新時(shí)間:2025年03月28日 09:56:06   作者:lakernote  
這篇文章主要介紹了可觀測(cè)性-Metrics-數(shù)據(jù)庫(kù)連接池HikariCP監(jiān)控教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

非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)加上HikariCPmicrometer-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)文章

最新評(píng)論

秭归县| 安新县| 怀柔区| 阿坝| 江门市| 西青区| 常山县| 务川| 红桥区| 株洲市| 汶川县| 墨竹工卡县| 龙泉市| 铜川市| 宁晋县| 平泉县| 方山县| 郁南县| 湘阴县| 盖州市| 崇文区| 洛扎县| 怀远县| 北海市| 休宁县| 竹山县| 安新县| 两当县| 贵州省| 石首市| 陵川县| 九龙坡区| 渑池县| 密云县| 广元市| 鄂尔多斯市| 万年县| 航空| 嘉鱼县| 荃湾区| 长丰县|