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

SpringBoot集成Druid監(jiān)控慢SQL的詳細(xì)過(guò)程

 更新時(shí)間:2024年06月21日 09:17:26   作者:奮斗的狍子007  
數(shù)據(jù)庫(kù)連接池是一個(gè)至關(guān)重要的組成部分,一個(gè)優(yōu)秀的數(shù)據(jù)庫(kù)連接池可以顯著提高應(yīng)用程序的性能和可伸縮性,常見的連接池:Druid、HikariCP、C3P0、DBCP等等,本文將詳細(xì)介紹如何在Spring Boot項(xiàng)目中配置數(shù)據(jù)源,集成Druid連接池,以實(shí)現(xiàn)更高效的數(shù)據(jù)庫(kù)連接管理

一、前言

數(shù)據(jù)庫(kù)連接池是一個(gè)至關(guān)重要的組成部分,一個(gè)優(yōu)秀的數(shù)據(jù)庫(kù)連接池可以顯著提高應(yīng)用程序的性能和可伸縮性。常見的連接池:Druid、HikariCP、C3P0、DBCP等等,不過(guò)目前大部分都是使用Druid或者SpringBoot默認(rèn)的HikariCP!

本文將詳細(xì)介紹如何在Spring Boot項(xiàng)目中配置數(shù)據(jù)源,集成Druid連接池,以實(shí)現(xiàn)更高效的數(shù)據(jù)庫(kù)連接管理。

二、常見的連接池介紹

1. C3P0

開源的JDBC連接池:C3P0實(shí)現(xiàn)了數(shù)據(jù)源和JNDI綁定,支持JDBC3規(guī)范和JDBC2的標(biāo)準(zhǔn)擴(kuò)展。

穩(wěn)定性好:盡管速度相對(duì)較慢(只是慢一丟丟),但穩(wěn)定性很好,Hibernate和Spring底層就使用了C3P0。

2. DBCP

Tomcat的數(shù)據(jù)庫(kù)連接池:Apache Tomcat DBCP是一個(gè)用于管理數(shù)據(jù)庫(kù)連接的組件,通常與Apache Tomcat服務(wù)器一起使用。

高效管理:它提供了一種機(jī)制來(lái)有效地管理數(shù)據(jù)庫(kù)連接,以便在高負(fù)載下提供更好的性能和可伸縮性。

配置靈活:可以通過(guò)Tomcat的配置文件(如context.xml)或者直接在應(yīng)用程序中的代碼中配置連接池的各種參數(shù)。

驗(yàn)證和性能優(yōu)化:DBCP可以配置為在從連接池中獲取連接時(shí)驗(yàn)證連接的有效性,并避免在每次數(shù)據(jù)庫(kù)請(qǐng)求時(shí)都重新創(chuàng)建和銷毀連接,從而提高了性能和效率。

3. HikariCP

高性能:HikariCP是一個(gè)高性能的Java數(shù)據(jù)庫(kù)連接池,它通過(guò)使用異步和非阻塞的方式,以及一些性能優(yōu)化的技術(shù),實(shí)現(xiàn)了卓越的連接獲取和釋放性能。

輕量級(jí):HikariCP的代碼庫(kù)非常小,只有幾百KB大小,不依賴大量的外部庫(kù)和復(fù)雜的依賴關(guān)系。

自動(dòng)化管理:HikariCP具有自動(dòng)化管理連接池的功能,可以根據(jù)應(yīng)用程序的需求動(dòng)態(tài)調(diào)整連接數(shù),并自動(dòng)管理連接的生命周期。

配置靈活:提供豐富的可配置選項(xiàng),支持連接池的最大連接數(shù)、最小空閑連接數(shù)、連接超時(shí)時(shí)間等多種配置參數(shù)。

4. Druid

高性能:Druid使用多線程和緩存技術(shù),能夠充分發(fā)揮數(shù)據(jù)庫(kù)的性能,提高應(yīng)用程序的響應(yīng)速度。

監(jiān)控功能:Druid提供了豐富的監(jiān)控功能,可以幫助開發(fā)人員及時(shí)發(fā)現(xiàn)和解決數(shù)據(jù)庫(kù)連接池的問題。

擴(kuò)展性強(qiáng):Druid具有良好的擴(kuò)展性,可以輕松地與其他框架集成,滿足不同應(yīng)用程序的需求。

防御能力:Druid具有強(qiáng)大的防御機(jī)制,可以有效地防止SQL注入等攻擊。

三、Druid介紹

Druid是一個(gè)由阿里巴巴開源的數(shù)據(jù)庫(kù)連接池實(shí)現(xiàn),它結(jié)合了C3P0、DBCP等數(shù)據(jù)庫(kù)連接池的優(yōu)點(diǎn),并加入了日志監(jiān)控功能。Druid支持所有JDBC兼容的數(shù)據(jù)庫(kù),包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等,并針對(duì)Oracle和MySql做了特別優(yōu)化。

Druid不僅是一個(gè)數(shù)據(jù)庫(kù)連接池,還提供了強(qiáng)大的監(jiān)控功能,可以監(jiān)控SQL的執(zhí)行時(shí)間、ResultSet持有時(shí)間、返回行數(shù)、更新行數(shù)等關(guān)鍵指標(biāo),有助于線上分析數(shù)據(jù)庫(kù)訪問性能

四、Druid的優(yōu)缺點(diǎn)

Druid的優(yōu)點(diǎn):

高性能:Druid能夠在高并發(fā)的環(huán)境下提供穩(wěn)定、快速的數(shù)據(jù)庫(kù)訪問服務(wù)。它使用內(nèi)存緩存、線程池、連接池等先進(jìn)技術(shù)來(lái)實(shí)現(xiàn)高性能,并且支持對(duì)SQL進(jìn)行解析和優(yōu)化,選擇最合適的執(zhí)行計(jì)劃,從而提高數(shù)據(jù)庫(kù)的執(zhí)行效率。

可擴(kuò)展性:Druid具有很好的可擴(kuò)展性,能夠根據(jù)業(yè)務(wù)的發(fā)展進(jìn)行靈活的擴(kuò)展。其設(shè)計(jì)采用了模塊化的思想,各個(gè)模塊之間解耦,方便進(jìn)行擴(kuò)展和升級(jí)。同時(shí),Druid還支持各種數(shù)據(jù)庫(kù),可以在不同的數(shù)據(jù)庫(kù)之間進(jìn)行切換。

穩(wěn)定性:Druid具有很高的穩(wěn)定性,能夠在系統(tǒng)運(yùn)行過(guò)程中保持穩(wěn)定,不會(huì)出現(xiàn)大的波動(dòng)。它在內(nèi)部實(shí)現(xiàn)了自動(dòng)均衡和負(fù)載均衡的功能,能夠根據(jù)數(shù)據(jù)庫(kù)服務(wù)器的負(fù)載情況自動(dòng)調(diào)整負(fù)載,保持了系統(tǒng)的穩(wěn)定性。此外,Druid還具有完善的異常處理機(jī)制,能夠及時(shí)處理異常情況,避免對(duì)系統(tǒng)造成大的影響。

強(qiáng)大的監(jiān)控能力:Druid具有強(qiáng)大的監(jiān)控能力,能夠?qū)崟r(shí)監(jiān)控和統(tǒng)計(jì)系統(tǒng)的各項(xiàng)指標(biāo),如連接數(shù)、SQL執(zhí)行效率、系統(tǒng)負(fù)載等。此外,它還支持與第三方監(jiān)控系統(tǒng)進(jìn)行集成,方便進(jìn)行系統(tǒng)的監(jiān)控和管理。

豐富的功能:Druid具有豐富的功能,如支持對(duì)SQL語(yǔ)句進(jìn)行動(dòng)態(tài)配置、數(shù)據(jù)庫(kù)備份和恢復(fù)、分庫(kù)分表等功能,方便對(duì)數(shù)據(jù)進(jìn)行管理和訪問。

高可用性:Druid連接池支持對(duì)連接的有效性進(jìn)行檢測(cè),可以自動(dòng)剔除無(wú)效的連接,并重新創(chuàng)建新的連接來(lái)保證連接的可用性。這些檢測(cè)機(jī)制可以避免應(yīng)用程序使用無(wú)效的數(shù)據(jù)庫(kù)連接,提高了應(yīng)用程序的穩(wěn)定性和可靠性。

安全性:Druid連接池提供了多種安全特性,包括防止惡意代碼注入、SQL注入和XSS攻擊等。它還支持按照IP地址、用戶名和密碼等方式對(duì)連接進(jìn)行白名單和黑名單過(guò)濾,增強(qiáng)了數(shù)據(jù)庫(kù)連接的安全性。

配置靈活:Druid連接池具有豐富的配置選項(xiàng),可以靈活地配置連接池的參數(shù),以滿足不同應(yīng)用程序的需求。

Druid的缺點(diǎn):

依賴性:將Druid引入項(xiàng)目會(huì)增加項(xiàng)目的依賴,可能會(huì)影響構(gòu)建和部署的復(fù)雜性。

五、Springboot集成Druid

1. 添加依賴

<!-- druid數(shù)據(jù)源 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.23</version>
</dependency>

<!-- mysql驅(qū)動(dòng)-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>5.1.30</version>
</dependency>


<!--mybatis,引入了 SpringBoot的 JDBC 模塊,所以,默認(rèn)是使用 hikari 作為數(shù)據(jù)源-->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.0.0</version>
    <exclusions>
        <!-- 排除默認(rèn)的 HikariCP 數(shù)據(jù)源 -->
        <exclusion>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </exclusion>
    </exclusions>
</dependency>

2. 添加配置

# 數(shù)據(jù)庫(kù)連接配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mysql?relaxAutoCommit=true&zeroDateTimeBehavior=convertToNull&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root

# 配置初始化大小、最小、最大
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=10

# 配置獲取連接等待超時(shí)的時(shí)間(單位:毫秒)
spring.datasource.druid.max-wait=60000

# 配置StatViewServlet(監(jiān)控頁(yè)面),用于展示Druid的統(tǒng)計(jì)信息
spring.datasource.druid.stat-view-servlet.enabled=true

# 訪問內(nèi)置監(jiān)控頁(yè)面的路徑,內(nèi)置監(jiān)控頁(yè)面的首頁(yè)是/druid/index.html
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*


# 監(jiān)控頁(yè)面賬戶與密碼
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin

# 配置WebStatFilter,用于采集web關(guān)聯(lián)監(jiān)控的數(shù)據(jù)
spring.datasource.druid.web-stat-filter.enabled=true
spring.datasource.druid.web-stat-filter.url-pattern=/*
spring.datasource.druid.web-stat-filter.exclusions=*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*

# 開啟druiddatasource的狀態(tài)監(jiān)控
spring.datasource.druid.filter.stat.enabled=true
spring.datasource.druid.filter.stat.db-type=mysql

# 開啟慢sql監(jiān)控
spring.datasource.druid.filter.stat.log-slow-sql=true

# 超過(guò)500ms 就認(rèn)為是慢sql,記錄到日志中,為了測(cè)試我這邊設(shè)置的小一點(diǎn)
spring.datasource.druid.filter.stat.slow-sql-millis=2

# 也可以這樣子,不過(guò)這個(gè)使用的都是默認(rèn)配置了
spring.datasource.druid.filters=stat,wall

3. 啟動(dòng)項(xiàng)目后,訪問 /druid/index.html,輸入上面配置中的用戶名與密碼

在這里插入圖片描述

4. 去除廣告

進(jìn)來(lái)之后發(fā)現(xiàn)這里有個(gè)廣告。展示的不太友好啊。

在這里插入圖片描述

添加一個(gè)過(guò)濾器,把這里不需要顯示的js給過(guò)濾掉。

@Configuration
@ConditionalOnWebApplication
@AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
@ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled", havingValue = "true", matchIfMissing = true)
public class DruidAdConfig {

    @Bean
    public FilterRegistrationBean removeDruidAdFilterRegistrationBean(DruidStatProperties properties) {

        // 獲取web監(jiān)控頁(yè)面的參數(shù)
        DruidStatProperties.StatViewServlet config = properties.getStatViewServlet();
        // 提取common.js的配置路徑
        String pattern = config.getUrlPattern() != null ? config.getUrlPattern() : "/druid/*";
        String commonJsPattern = pattern.replaceAll("\\*", "js/common.js");

        final String filePath = "support/http/resources/js/common.js";

        //創(chuàng)建filter進(jìn)行過(guò)濾
        Filter filter = new Filter() {
            @Override
            public void init(FilterConfig filterConfig) throws ServletException {}

            @Override
            public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
                chain.doFilter(request, response);
                // 重置緩沖區(qū),響應(yīng)頭不會(huì)被重置
                response.resetBuffer();
                // 獲取common.js
                String text = Utils.readFromResource(filePath);
                // 正則替換banner, 除去底部的廣告信息
                text = text.replaceAll("<a.*?banner\"></a><br/>", "");
                text = text.replaceAll("powered.*?shrek.wang</a>", "");
                response.getWriter().write(text);
            }

            @Override
            public void destroy() {}
        };

        FilterRegistrationBean registrationBean = new FilterRegistrationBean();
        registrationBean.setFilter(filter);
        registrationBean.addUrlPatterns(commonJsPattern);
        return registrationBean;
    }
}

重新啟動(dòng)項(xiàng)目,重新登陸賬號(hào)進(jìn)入查看。

在這里插入圖片描述

5. SQL監(jiān)控頁(yè)面

執(zhí)行一些接口調(diào)用之后,在查看SQL監(jiān)控頁(yè)面。

在這里插入圖片描述

提供了慢SQL的統(tǒng)計(jì)信息,如慢SQL的數(shù)量、總執(zhí)行時(shí)間、執(zhí)行行數(shù)等。

六、獲取Druid的監(jiān)控?cái)?shù)據(jù)

Druid的監(jiān)控?cái)?shù)據(jù)可以在開啟StatFilter后 ,通過(guò)DruidStatManagerFacade進(jìn)行獲取。DruidStatManagerFacade#getDataSourceStatDataList該方法可以獲取所有數(shù)據(jù)源的監(jiān)控?cái)?shù)據(jù),除此之外 DruidStatManagerFacade 還提供了一些其他方法,可以按需選擇使用。

@RestController
@RequestMapping(value = "/druid")
public class DruidStatController {

    @GetMapping("/stat")
    public Object druidStat(){
        // 獲取數(shù)據(jù)源的監(jiān)控?cái)?shù)據(jù)
        return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
    }
}

在這里插入圖片描述

Druid是一個(gè)功能強(qiáng)大、性能優(yōu)異、易于使用、可擴(kuò)展和可靠的數(shù)據(jù)庫(kù)連接池。在實(shí)際應(yīng)用中,它已經(jīng)被廣泛應(yīng)用于各種高并發(fā)、大數(shù)據(jù)量和大批量請(qǐng)求的業(yè)務(wù)場(chǎng)景中,并得到了業(yè)界的廣泛認(rèn)可和好評(píng)。使用它可以幫我們創(chuàng)建和管理數(shù)據(jù)庫(kù)連接,可以使用慢sql等監(jiān)控功能,使用數(shù)據(jù)庫(kù)密碼加密等豐富的擴(kuò)展功能。

以上就是SpringBoot集成Druid監(jiān)控慢SQL的詳細(xì)過(guò)程的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Druid監(jiān)控慢SQL的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 深入講解Java?synchronized的核心原理

    深入講解Java?synchronized的核心原理

    這篇文章主要為大家詳細(xì)介紹了Java中synchronized的核心原理以及簡(jiǎn)單的用法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-07-07
  • 詳談jpa中表的@OneToMany等關(guān)聯(lián)關(guān)系

    詳談jpa中表的@OneToMany等關(guān)聯(lián)關(guān)系

    這篇文章主要介紹了詳談jpa中表的@OneToMany等關(guān)聯(lián)關(guān)系,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java編程實(shí)現(xiàn)驗(yàn)證哥德巴赫猜想

    Java編程實(shí)現(xiàn)驗(yàn)證哥德巴赫猜想

    這篇文章主要介紹了Java編程實(shí)現(xiàn)驗(yàn)證哥德巴赫猜想,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • Java Web文件上傳與下載優(yōu)化的實(shí)現(xiàn)方案

    Java Web文件上傳與下載優(yōu)化的實(shí)現(xiàn)方案

    文件上傳與下載是 Web 應(yīng)用中常見的功能,尤其是在需要處理大量文件傳輸、存儲(chǔ)的場(chǎng)景下,傳統(tǒng)的文件上傳和下載方式雖然簡(jiǎn)單,但如果不加以優(yōu)化,可能會(huì)帶來(lái)一些問題,所以今天,我們將深入探討 Java Web 中如何實(shí)現(xiàn)高效的文件上傳和下載,需要的朋友可以參考下
    2025-02-02
  • Spring,hibernate,struts經(jīng)典面試筆試題(含答案)

    Spring,hibernate,struts經(jīng)典面試筆試題(含答案)

    這篇文章主要介紹了Spring,hibernate,struts經(jīng)典面試筆試題極其參考含答案,涉及SSH基本概念,原理與使用技巧,需要的朋友可以參考下
    2016-03-03
  • SpringBoot SSO輕松實(shí)現(xiàn)(附demo)

    SpringBoot SSO輕松實(shí)現(xiàn)(附demo)

    這篇文章主要介紹了SpringBoot SSO輕松實(shí)現(xiàn)(附demo),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Java之ThreadPoolExecutor類詳解

    Java之ThreadPoolExecutor類詳解

    這篇文章主要介紹了Java之ThreadPoolExecutor類詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出

    SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出

    這篇文章主要介紹了SpringBoot整合EasyExcel實(shí)現(xiàn)文件導(dǎo)入導(dǎo)出的方法,幫助大家更好的理解和學(xué)習(xí)使用SpringBoot,感興趣的朋友可以了解下
    2021-05-05
  • Java入門指南之IDEA高效調(diào)試與數(shù)組

    Java入門指南之IDEA高效調(diào)試與數(shù)組

    調(diào)試是指在程序運(yùn)行過(guò)程中,通過(guò)各種手段觀察程序的執(zhí)行狀態(tài)、變量值的變化等,以找出程序中存在的錯(cuò)誤或異常的過(guò)程,這篇文章主要介紹了Java入門指南之IDEA高效調(diào)試與數(shù)組的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解

    Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之順序表詳解,線性表在邏輯上是線性結(jié)構(gòu),也就說(shuō)是連續(xù)的一條直線。但是在物理結(jié)構(gòu)上并不一定是連續(xù)的,線性表在物理上存儲(chǔ)時(shí),通常以數(shù)組和鏈?zhǔn)浇Y(jié)構(gòu)的形式存儲(chǔ),需要的朋友可以參考下
    2023-07-07

最新評(píng)論

新津县| 中江县| 揭西县| 云霄县| 溧水县| 阿瓦提县| 阿拉善盟| 盐边县| 潜山县| 石泉县| 石首市| 英吉沙县| 龙川县| 宜兰市| 霞浦县| 尼玛县| 乌拉特前旗| 常德市| 华池县| 兴海县| 襄汾县| 本溪市| 桐乡市| 伊金霍洛旗| 桐柏县| 长乐市| 神农架林区| 东乌| 疏勒县| 广东省| 卓资县| 永州市| 山东| 松溪县| 翼城县| 文化| 延津县| 长海县| 修水县| 定陶县| 罗平县|