首頁 > 軟體

Spring Boot如何監控SQL執行情況?

2022-04-18 19:00:30

前言

監控SQL是現在專案運維中必要的一部分,通過SQL監控我們能夠明顯的分析系統那些地方存在問題,從而有效的進行SQL優化,提升系統的效能。那麼常見的SQL監控方式又那些呢?

MYSQL監控慢SQL

MySLQ如果需要監控慢SQL,需要在/ect/my.cnf檔案中進行如下設定:

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時間為多久為慢SQL

輸出結果

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的查詢時間、鎖定時間、影響的行數等。

Druid監控慢SQL

Spring Boot預設使用的資料庫連線池為HikariCP,但是Druid連線池為阿里巴巴開發的,提供強大的監控和擴充套件功能,如果專案中使用Druid連線池而沒有開啟SQL監控,那麼對於專案來說就是一種浪費,那麼Spring Boot Druid如何監控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
      //最大連線數
      max-active: 100
      //最小連線數
      min-idle: 10
      #連線等待時間
      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監控頁面
      stat-view-servlet:
            #開啟
            enabled: true
            #存取監控路徑的地址
            url-pattern: /druid/*
            #不允許清空,重新統計
            reset-enable: false
            #登入使用者名稱
            login-username: admin
            #登入密碼
            login-password: admin
            #允許存取地址
            allow: 127.0.0.1
      ########## 設定WebStatFilter,用於採集web關聯監控的資料 #########
      web-stat-filter:
        #啟動statFilter
        enabled: true
        #排除的url
        exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico
        #開啟session統計
        session-stat-enable: true  
        #session的最大個數,預設為100
        session-stat-max-count: 1000
        #過濾的url
        url-pattern: /*
      filter:
           stat:
             #開啟慢sql統計
             log-slow-sql: true
             #慢sql的時間
             slow-sql-millis: 2000
             merge-sql: true
             #開啟druid datasource監控
             enabled: true
           wall:
             config:
             multi-statement-allow: true

監控頁面

1.啟動專案,存取http://ip:port/druid, 進入登入頁面,輸入使用者名稱和密碼登入

2.資料來源頁面,該頁面設定的是當前dataSource的相關資訊

3.SQL監控頁面

此頁面會展示所有執行sql的語句,包含SQL執行次數、執行的時間、事務執行次數、最慢執行時間等資訊

4.URI監控,統計了所有Controller介面的存取以及執行情況

5.去除相關的廣告

存取監控頁面的時候,你可能會在頁面底部(footer)看到阿里巴巴的廣告 原因:引入的druid的jar包中的common.js(裡面有一段js程式碼是給頁面的footer追加廣告的) 去除的方案有兩種

5.1 直接註釋原始碼中的的相關程式碼

找到 druid-1.19 jar包 在common.j中直接註釋如下程式碼即可

  // this.buildFooter();

5.2 自定義過濾來去除廣告

@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);
    }
}

注意需要在中新增相關的過濾器

@SpringBootApplication
@ServletComponentScan("com.skywares.fw.common.filter")//設定過濾器的地址
public class FwCoreApplication
{
    public static void main(String[] args)
    {
        SpringApplication.run(FwCoreApplication.class, args);
    }
}

特殊說明

目前Driud監控SQL功能只能針對單資料庫的情況,對於多資料來源的場景無法滿足。

Prometheus+grafana實現SQL監控

Prometheus+grafana實現SQL監控方案比較複雜,本文中就不詳細講解了,在後續的效能優化專欄中會重點講解。

結尾

SQL監控是專案中比較重要的一環,本文從幾個方法來講解如何監控SQL,如果專案中還沒使用此功能,那麼趕緊去開啟吧。

到此這篇關於Spring Boot如何監控SQL執行情況的文章就介紹到這了,更多相關SpringBoot監控SQL內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com