Spring?Boot如何監(jiān)控SQL運(yùn)行情況?
前言
監(jiān)控SQL是現(xiàn)在項(xiàng)目運(yùn)維中必要的一部分,通過(guò)SQL監(jiān)控我們能夠明顯的分析系統(tǒng)那些地方存在問(wèn)題,從而有效的進(jìn)行SQL優(yōu)化,提升系統(tǒng)的性能。那么常見的SQL監(jiān)控方式又那些呢?
MYSQL監(jiān)控慢SQL
MySLQ如果需要監(jiān)控慢SQL,需要在/ect/my.cnf文件中進(jìn)行如下配置:
slow_query_log = ON slow_query_log_file = /data/mysql/slow.log long_query_time = 2
- slow_query_log:打開慢SQL日志
- slow_query_log_file:輸出慢SQL文件的路徑
- long_query_time : 定義SQl時(shí)間為多久為慢SQL
輸出結(jié)果
select userid from t_user;
# Time: 2022-04-16T20:40:30.411674Z
# Query_time: 90.438767 Lock_time: 0.000000 Rows_sent: 43 Rows_examined: 25360591
輸出SQL的查詢時(shí)間、鎖定時(shí)間、影響的行數(shù)等。
Druid監(jiān)控慢SQL
Spring Boot默認(rèn)使用的數(shù)據(jù)庫(kù)連接池為HikariCP,但是Druid連接池為阿里巴巴開發(fā)的,提供強(qiáng)大的監(jiān)控和擴(kuò)展功能,如果項(xiàng)目中使用Druid連接池而沒(méi)有開啟SQL監(jiān)控,那么對(duì)于項(xiàng)目來(lái)說(shuō)就是一種浪費(fèi),那么Spring Boot Druid如何監(jiān)控SQL呢?
添加Druid依賴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <!--druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency>
Yml文件中配置Druid屬性
spring: messages: encoding: UTF-8 baseName: i18n/messages fallbackToSystemLocale: false datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?allowMultiQueries=true&characterEncoding=utf8&serverTimezone=Hongkong&useSSL=true&nullNamePatternMatchesAll=true&autoReconnect=true username: xx password: yy #初始連接池值 initial-size: 10 //最大連接數(shù) max-active: 100 //最小連接數(shù) min-idle: 10 #連接等待時(shí)間 max-wait: 60000 # pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 validation-query: SELECT 1 FROM DUAL test-while-idle: true test-on-borrow: false test-on-return: false #配置StatViewServlet監(jiān)控頁(yè)面 stat-view-servlet: #開啟 enabled: true #訪問(wèn)監(jiān)控路徑的地址 url-pattern: /druid/* #不允許清空,重新統(tǒng)計(jì) reset-enable: false #登錄用戶名 login-username: admin #登錄密碼 login-password: admin #允許訪問(wèn)地址 allow: 127.0.0.1 ########## 配置WebStatFilter,用于采集web關(guān)聯(lián)監(jiān)控的數(shù)據(jù) ######### web-stat-filter: #啟動(dòng)statFilter enabled: true #排除的url exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico #開啟session統(tǒng)計(jì) session-stat-enable: true #session的最大個(gè)數(shù),默認(rèn)為100 session-stat-max-count: 1000 #過(guò)濾的url url-pattern: /* filter: stat: #開啟慢sql統(tǒng)計(jì) log-slow-sql: true #慢sql的時(shí)間 slow-sql-millis: 2000 merge-sql: true #開啟druid datasource監(jiān)控 enabled: true wall: config: multi-statement-allow: true
監(jiān)控頁(yè)面
1.啟動(dòng)項(xiàng)目,訪問(wèn)http://ip:port/druid, 進(jìn)入登錄頁(yè)面,輸入用戶名和密碼登錄
2.數(shù)據(jù)源頁(yè)面,該頁(yè)面配置的是當(dāng)前dataSource的相關(guān)信息
3.SQL監(jiān)控頁(yè)面
此頁(yè)面會(huì)展示所有執(zhí)行sql的語(yǔ)句,包含SQL執(zhí)行次數(shù)、執(zhí)行的時(shí)間、事務(wù)執(zhí)行次數(shù)、最慢執(zhí)行時(shí)間等信息
4.URI監(jiān)控,統(tǒng)計(jì)了所有Controller接口的訪問(wèn)以及執(zhí)行情況
5.去除相關(guān)的廣告
訪問(wèn)監(jiān)控頁(yè)面的時(shí)候,你可能會(huì)在頁(yè)面底部(footer)看到阿里巴巴的廣告 原因:引入的druid的jar包中的common.js(里面有一段js代碼是給頁(yè)面的footer追加廣告的) 去除的方案有兩種
5.1 直接注釋源碼中的的相關(guān)代碼
找到 druid-1.19 jar包 在common.j中直接注釋如下代碼即可
// this.buildFooter();
5.2 自定義過(guò)濾來(lái)去除廣告
@WebFilter(urlPatterns = "/druid/js/common.js") public class RemoveDruidAdvertFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String text = Utils.readFromResource("support/http/resources/js/common.js"); text = text.replace("this.buildFooter();", ""); response.getWriter().write(text); } }
注意需要在中添加相關(guān)的過(guò)濾器
@SpringBootApplication @ServletComponentScan("com.skywares.fw.common.filter")//配置過(guò)濾器的地址 public class FwCoreApplication { public static void main(String[] args) { SpringApplication.run(FwCoreApplication.class, args); } }
特殊說(shuō)明
目前Driud監(jiān)控SQL功能只能針對(duì)單數(shù)據(jù)庫(kù)的情況,對(duì)于多數(shù)據(jù)源的場(chǎng)景無(wú)法滿足。
Prometheus+grafana實(shí)現(xiàn)SQL監(jiān)控
Prometheus+grafana實(shí)現(xiàn)SQL監(jiān)控方案比較復(fù)雜,本文中就不詳細(xì)講解了,在后續(xù)的性能優(yōu)化專欄中會(huì)重點(diǎn)講解。
結(jié)尾
SQL監(jiān)控是項(xiàng)目中比較重要的一環(huán),本文從幾個(gè)方法來(lái)講解如何監(jiān)控SQL,如果項(xiàng)目中還沒(méi)使用此功能,那么趕緊去開啟吧。
到此這篇關(guān)于Spring Boot如何監(jiān)控SQL運(yùn)行情況的文章就介紹到這了,更多相關(guān)SpringBoot監(jiān)控SQL內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis的mapper.xml中resultMap標(biāo)簽的使用詳解
這篇文章主要介紹了mybatis的mapper.xml中resultMap標(biāo)簽的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06詳解java中的互斥鎖信號(hào)量和多線程等待機(jī)制
這篇文章主要介紹了Java編程中的互斥鎖,信號(hào)量和多線程等待機(jī)制實(shí)例詳解,簡(jiǎn)單介紹了互斥鎖和信號(hào)量的區(qū)別,需要的朋友可以了解下。2017-09-09JavaWeb項(xiàng)目FullCalendar日歷插件使用的示例代碼
本篇文章主要介紹了JavaWeb項(xiàng)目FullCalendar日歷插件使用的示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Java的IO流實(shí)現(xiàn)文件和文件夾的復(fù)制
這篇文章主要為大家詳細(xì)介紹了Java的IO流實(shí)現(xiàn)文件和文件夾的復(fù)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06SpringBoot項(xiàng)目配置postgresql數(shù)據(jù)庫(kù)完整步驟(配置多數(shù)據(jù)源)
PostgreSQL是一種特性非常齊全的自由軟件的對(duì)象-關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)(ORDBMS),下面這篇文章主要給大家介紹了關(guān)于SpringBoot項(xiàng)目配置postgresql數(shù)據(jù)庫(kù)(配置多數(shù)據(jù)源)的相關(guān)資料,需要的朋友可以參考下2023-05-05總結(jié)一下關(guān)于在Java8中使用stream流踩過(guò)的一些坑
java8新增了stream流式處理,對(duì)于list的各種操作處理提供了好多方法 ,用過(guò)的都知道,方便極了.比如篩選、排序、合并、類型轉(zhuǎn)換等等.以下是我實(shí)際工作中踩過(guò)的坑,記錄下避免大家踩坑,需要的朋友可以參考下2021-06-06SpringBoot整合ES-Elasticsearch的實(shí)例
這篇文章主要介紹了SpringBoot整合ES-Elasticsearch的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05