SpringBoot集成Druid監(jiān)控慢SQL的詳細過程
一、前言
數(shù)據(jù)庫連接池是一個至關(guān)重要的組成部分,一個優(yōu)秀的數(shù)據(jù)庫連接池可以顯著提高應(yīng)用程序的性能和可伸縮性。常見的連接池:Druid、HikariCP、C3P0、DBCP等等,不過目前大部分都是使用Druid或者SpringBoot默認的HikariCP!
本文將詳細介紹如何在Spring Boot項目中配置數(shù)據(jù)源,集成Druid連接池,以實現(xiàn)更高效的數(shù)據(jù)庫連接管理。
二、常見的連接池介紹
1. C3P0
開源的JDBC連接池:C3P0實現(xiàn)了數(shù)據(jù)源和JNDI綁定,支持JDBC3規(guī)范和JDBC2的標準擴展。
穩(wěn)定性好:盡管速度相對較慢(只是慢一丟丟),但穩(wěn)定性很好,Hibernate和Spring底層就使用了C3P0。
2. DBCP
Tomcat的數(shù)據(jù)庫連接池:Apache Tomcat DBCP是一個用于管理數(shù)據(jù)庫連接的組件,通常與Apache Tomcat服務(wù)器一起使用。
高效管理:它提供了一種機制來有效地管理數(shù)據(jù)庫連接,以便在高負載下提供更好的性能和可伸縮性。
配置靈活:可以通過Tomcat的配置文件(如context.xml)或者直接在應(yīng)用程序中的代碼中配置連接池的各種參數(shù)。
驗證和性能優(yōu)化:DBCP可以配置為在從連接池中獲取連接時驗證連接的有效性,并避免在每次數(shù)據(jù)庫請求時都重新創(chuàng)建和銷毀連接,從而提高了性能和效率。
3. HikariCP
高性能:HikariCP是一個高性能的Java數(shù)據(jù)庫連接池,它通過使用異步和非阻塞的方式,以及一些性能優(yōu)化的技術(shù),實現(xiàn)了卓越的連接獲取和釋放性能。
輕量級:HikariCP的代碼庫非常小,只有幾百KB大小,不依賴大量的外部庫和復(fù)雜的依賴關(guān)系。
自動化管理:HikariCP具有自動化管理連接池的功能,可以根據(jù)應(yīng)用程序的需求動態(tài)調(diào)整連接數(shù),并自動管理連接的生命周期。
配置靈活:提供豐富的可配置選項,支持連接池的最大連接數(shù)、最小空閑連接數(shù)、連接超時時間等多種配置參數(shù)。
4. Druid
高性能:Druid使用多線程和緩存技術(shù),能夠充分發(fā)揮數(shù)據(jù)庫的性能,提高應(yīng)用程序的響應(yīng)速度。
監(jiān)控功能:Druid提供了豐富的監(jiān)控功能,可以幫助開發(fā)人員及時發(fā)現(xiàn)和解決數(shù)據(jù)庫連接池的問題。
擴展性強:Druid具有良好的擴展性,可以輕松地與其他框架集成,滿足不同應(yīng)用程序的需求。
防御能力:Druid具有強大的防御機制,可以有效地防止SQL注入等攻擊。
三、Druid介紹
Druid是一個由阿里巴巴開源的數(shù)據(jù)庫連接池實現(xiàn),它結(jié)合了C3P0、DBCP等數(shù)據(jù)庫連接池的優(yōu)點,并加入了日志監(jiān)控功能。Druid支持所有JDBC兼容的數(shù)據(jù)庫,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等,并針對Oracle和MySql做了特別優(yōu)化。
Druid不僅是一個數(shù)據(jù)庫連接池,還提供了強大的監(jiān)控功能,可以監(jiān)控SQL的執(zhí)行時間、ResultSet持有時間、返回行數(shù)、更新行數(shù)等關(guān)鍵指標,有助于線上分析數(shù)據(jù)庫訪問性能
四、Druid的優(yōu)缺點
Druid的優(yōu)點:
高性能:Druid能夠在高并發(fā)的環(huán)境下提供穩(wěn)定、快速的數(shù)據(jù)庫訪問服務(wù)。它使用內(nèi)存緩存、線程池、連接池等先進技術(shù)來實現(xiàn)高性能,并且支持對SQL進行解析和優(yōu)化,選擇最合適的執(zhí)行計劃,從而提高數(shù)據(jù)庫的執(zhí)行效率。
可擴展性:Druid具有很好的可擴展性,能夠根據(jù)業(yè)務(wù)的發(fā)展進行靈活的擴展。其設(shè)計采用了模塊化的思想,各個模塊之間解耦,方便進行擴展和升級。同時,Druid還支持各種數(shù)據(jù)庫,可以在不同的數(shù)據(jù)庫之間進行切換。
穩(wěn)定性:Druid具有很高的穩(wěn)定性,能夠在系統(tǒng)運行過程中保持穩(wěn)定,不會出現(xiàn)大的波動。它在內(nèi)部實現(xiàn)了自動均衡和負載均衡的功能,能夠根據(jù)數(shù)據(jù)庫服務(wù)器的負載情況自動調(diào)整負載,保持了系統(tǒng)的穩(wěn)定性。此外,Druid還具有完善的異常處理機制,能夠及時處理異常情況,避免對系統(tǒng)造成大的影響。
強大的監(jiān)控能力:Druid具有強大的監(jiān)控能力,能夠?qū)崟r監(jiān)控和統(tǒng)計系統(tǒng)的各項指標,如連接數(shù)、SQL執(zhí)行效率、系統(tǒng)負載等。此外,它還支持與第三方監(jiān)控系統(tǒng)進行集成,方便進行系統(tǒng)的監(jiān)控和管理。
豐富的功能:Druid具有豐富的功能,如支持對SQL語句進行動態(tài)配置、數(shù)據(jù)庫備份和恢復(fù)、分庫分表等功能,方便對數(shù)據(jù)進行管理和訪問。
高可用性:Druid連接池支持對連接的有效性進行檢測,可以自動剔除無效的連接,并重新創(chuàng)建新的連接來保證連接的可用性。這些檢測機制可以避免應(yīng)用程序使用無效的數(shù)據(jù)庫連接,提高了應(yīng)用程序的穩(wěn)定性和可靠性。
安全性:Druid連接池提供了多種安全特性,包括防止惡意代碼注入、SQL注入和XSS攻擊等。它還支持按照IP地址、用戶名和密碼等方式對連接進行白名單和黑名單過濾,增強了數(shù)據(jù)庫連接的安全性。
配置靈活:Druid連接池具有豐富的配置選項,可以靈活地配置連接池的參數(shù),以滿足不同應(yīng)用程序的需求。
Druid的缺點:
依賴性:將Druid引入項目會增加項目的依賴,可能會影響構(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ū)動-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version>
</dependency>
<!--mybatis,引入了 SpringBoot的 JDBC 模塊,所以,默認是使用 hikari 作為數(shù)據(jù)源-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
<exclusions>
<!-- 排除默認的 HikariCP 數(shù)據(jù)源 -->
<exclusion>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</exclusion>
</exclusions>
</dependency>
2. 添加配置
# 數(shù)據(jù)庫連接配置 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 # 配置獲取連接等待超時的時間(單位:毫秒) spring.datasource.druid.max-wait=60000 # 配置StatViewServlet(監(jiān)控頁面),用于展示Druid的統(tǒng)計信息 spring.datasource.druid.stat-view-servlet.enabled=true # 訪問內(nèi)置監(jiān)控頁面的路徑,內(nèi)置監(jiān)控頁面的首頁是/druid/index.html spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 監(jiān)控頁面賬戶與密碼 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 # 超過500ms 就認為是慢sql,記錄到日志中,為了測試我這邊設(shè)置的小一點 spring.datasource.druid.filter.stat.slow-sql-millis=2 # 也可以這樣子,不過這個使用的都是默認配置了 spring.datasource.druid.filters=stat,wall
3. 啟動項目后,訪問 /druid/index.html,輸入上面配置中的用戶名與密碼

4. 去除廣告
進來之后發(fā)現(xiàn)這里有個廣告。展示的不太友好啊。

添加一個過濾器,把這里不需要顯示的js給過濾掉。
@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)控頁面的參數(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進行過濾
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)頭不會被重置
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;
}
}
重新啟動項目,重新登陸賬號進入查看。

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

提供了慢SQL的統(tǒng)計信息,如慢SQL的數(shù)量、總執(zhí)行時間、執(zhí)行行數(shù)等。
六、獲取Druid的監(jiān)控數(shù)據(jù)
Druid的監(jiān)控數(shù)據(jù)可以在開啟StatFilter后 ,通過DruidStatManagerFacade進行獲取。DruidStatManagerFacade#getDataSourceStatDataList該方法可以獲取所有數(shù)據(jù)源的監(jiān)控數(shù)據(jù),除此之外 DruidStatManagerFacade 還提供了一些其他方法,可以按需選擇使用。
@RestController
@RequestMapping(value = "/druid")
public class DruidStatController {
@GetMapping("/stat")
public Object druidStat(){
// 獲取數(shù)據(jù)源的監(jiān)控數(shù)據(jù)
return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
}
}

Druid是一個功能強大、性能優(yōu)異、易于使用、可擴展和可靠的數(shù)據(jù)庫連接池。在實際應(yīng)用中,它已經(jīng)被廣泛應(yīng)用于各種高并發(fā)、大數(shù)據(jù)量和大批量請求的業(yè)務(wù)場景中,并得到了業(yè)界的廣泛認可和好評。使用它可以幫我們創(chuàng)建和管理數(shù)據(jù)庫連接,可以使用慢sql等監(jiān)控功能,使用數(shù)據(jù)庫密碼加密等豐富的擴展功能。
以上就是SpringBoot集成Druid監(jiān)控慢SQL的詳細過程的詳細內(nèi)容,更多關(guān)于SpringBoot Druid監(jiān)控慢SQL的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot整合redis+Aop防止重復(fù)提交的實現(xiàn)
Spring Boot通過AOP可以實現(xiàn)防止表單重復(fù)提交,本文主要介紹了SpringBoot整合redis+Aop防止重復(fù)提交的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-07-07
FasfDFS整合Java實現(xiàn)文件上傳下載功能實例詳解
這篇文章主要介紹了FasfDFS整合Java實現(xiàn)文件上傳下載功能實例詳解,需要的朋友可以參考下2017-08-08
SpringBoot+SpringCloud用戶信息微服務(wù)傳遞實現(xiàn)解析
這篇文章主要介紹了SpringBoot+SpringCloud實現(xiàn)登錄用戶信息在微服務(wù)之間的傳遞,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-11-11

