1. <dd id="erndk"></dd>
                1. SpringBoot使用Druid監控SQL

                  互聯網 2022/5/2 19:42:58

                  目錄1 監控mybatis下SQL1.1 Druid簡介1.2 添加pom.xml依賴1.3 配置相關屬性1.3.1 如何配置 Filter1.4 監控頁面1.5 sql監控1.6 慢sql記錄1.7 spring 監控1.8 去 Ad(廣告)1.9 獲取Druid的監控數據2 監控mybatis-plus下SQL2.1 pom.xml2.2 application.yml2.3 相關配置信息 1…

                  目錄
                  • 1 監控mybatis下SQL
                    • 1.1 Druid簡介
                    • 1.2 添加pom.xml依賴
                    • 1.3 配置相關屬性
                      • 1.3.1 如何配置 Filter
                    • 1.4 監控頁面
                    • 1.5 sql監控
                    • 1.6 慢sql記錄
                    • 1.7 spring 監控
                    • 1.8 去 Ad(廣告)
                    • 1.9 獲取Druid的監控數據
                  • 2 監控mybatis-plus下SQL
                    • 2.1 pom.xml
                    • 2.2 application.yml
                    • 2.3 相關配置信息

                  1 監控mybatis下SQL

                  1.1 Druid簡介

                  Druid是阿里巴巴開發的號稱為監控而生的數據庫連接池,在功能、性能、擴展性方面,都超過其他數據庫連接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒殺一切。

                  Druid可以很好的監控 DB池連接和 SQL 的執行情況,天生就是針對監控而生的 DB 連接池。

                  Spring Boot 默認數據源 HikariDataSourceJdbcTemplate中已經介紹 Spring Boot 2.x 默認使用 Hikari 數據源,可以說 HikariDriud 都是當前 Java Web 上最優秀的數據源。

                  其中的監控器:

                  • statDruid內置提供一個StatFilter,用于統計監控信息。
                  • wallDruid防御SQL注入攻擊的WallFilter就是通過DruidSQL Parser分析。Druid提供的SQL Parser可以在JDBC層攔截SQL做相應處理,比如說分庫分表、審計等。
                  • log4j2:這個就是 日志記錄的功能,可以把sql語句打印到log4j2供排查問題。

                  1.2 添加pom.xml依賴

                  <!-- 阿里巴巴的druid數據源 -->
                  <dependency>
                      <groupId>com.alibaba</groupId>
                      <artifactId>druid-spring-boot-starter</artifactId>
                      <version>1.1.23</version>
                  </dependency>
                  <!-- mysql8 驅動-->
                  <dependency>
                      <groupId>mysql</groupId>
                      <artifactId>mysql-connector-java</artifactId>
                      <scope>runtime</scope>
                  </dependency>
                  <!--使用 log4j2 記錄日志-->
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-log4j2</artifactId>
                  </dependency>
                  
                  <!--
                  mybatis,引入了 SpringBoot的 JDBC 模塊,
                  所以,默認是使用 hikari 作為數據源
                  -->
                  <dependency>
                      <groupId>org.mybatis.spring.boot</groupId>
                      <artifactId>mybatis-spring-boot-starter</artifactId>
                      <version>2.1.3</version>
                      <exclusions>
                          <!-- 排除默認的 HikariCP 數據源 -->
                          <exclusion>
                              <groupId>com.zaxxer</groupId>
                              <artifactId>HikariCP</artifactId>
                          </exclusion>
                      </exclusions>
                  </dependency>
                  

                  1.3 配置相關屬性

                  • 配置Druid數據源(連接池): 如同以前 c3p0、dbcp 數據源可以設置數據源連接初始化大小、最大連接數、等待時間、最小連接數 等一樣,Druid 數據源同理可以進行設置;
                  • 配置 Druid web 監控 filterWebStatFilter): 這個過濾器的作用就是統計 web 應用請求中所有的數據庫信息,比如 發出的 sql 語句,sql 執行的時間、請求次數、請求的 url 地址、以及seesion 監控、數據庫表的訪問次數 等等。
                  • 配置 Druid 后臺管理 ServletStatViewServlet): Druid 數據源具有監控的功能,并提供了一個 web 界面方便用戶查看,類似安裝路由器 時,人家也提供了一個默認的 web 頁面;需要設置 Druid 的后臺管理頁面的屬性,比如 登錄賬號、密碼 等;

                  注意:
                  Druid Spring Boot Starter配置屬性的名稱完全遵照 Druid,可以通過 Spring Boot 配置文件來配置Druid數據庫連接池和監控,如果沒有配置則使用默認值。

                  application.yml

                  ########## 配置數據源 (Druid)##########
                  spring:
                    datasource:
                      ########## JDBC 基本配置 ##########
                      username: xxx
                      password: xxx
                      driver-class-name: com.mysql.cj.jdbc.Driver # mysql8 的連接驅動
                      url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai
                      platform: mysql # 數據庫類型
                      type: com.alibaba.druid.pool.DruidDataSource # 指定數據源類型
                      ########## 連接池 配置 ##########
                      druid:
                        # 配置初始化大小、最小、最大
                        initial-size: 5
                        minIdle: 10
                        max-active: 20
                        # 配置獲取連接等待超時的時間(單位:毫秒)
                        max-wait: 60000
                        # 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
                        time-between-eviction-runs-millis: 2000
                        # 配置一個連接在池中最小生存的時間,單位是毫秒
                        min-evictable-idle-time-millis: 600000
                        max-evictable-idle-time-millis: 900000
                        # 用來測試連接是否可用的SQL語句,默認值每種數據庫都不相同,這是mysql
                        validationQuery: select 1
                        # 應用向連接池申請連接,并且testOnBorrow為false時,連接池將會判斷連接是否處于空閑狀態,如果是,則驗證這條連接是否可用
                        testWhileIdle: true
                        # 如果為true,默認是false,應用向連接池申請連接時,連接池會判斷這條連接是否是可用的
                        testOnBorrow: false
                        # 如果為true(默認false),當應用使用完連接,連接池回收連接的時候會判斷該連接是否還可用
                        testOnReturn: false
                        # 是否緩存preparedStatement,也就是PSCache。PSCache對支持游標的數據庫性能提升巨大,比如說oracle
                        poolPreparedStatements: true
                        # 要啟用PSCache,必須配置大于0,當大于0時, poolPreparedStatements自動觸發修改為true,
                        # 在Druid中,不會存在Oracle下PSCache占用內存過多的問題,
                        # 可以把這個數值配置大一些,比如說100
                        maxOpenPreparedStatements: 20
                        # 連接池中的minIdle數量以內的連接,空閑時間超過minEvictableIdleTimeMillis,則會執行keepAlive操作
                        keepAlive: true
                        # Spring 監控,利用aop 對指定接口的執行時間,jdbc數進行記錄
                        aop-patterns: "com.springboot.template.dao.*"
                        ########### 啟用內置過濾器(第一個 stat必須,否則監控不到SQL)##########
                        filters: stat,wall,log4j2
                        # 自己配置監控統計攔截的filter
                        filter:
                          # 開啟druiddatasource的狀態監控
                          stat:
                            enabled: true
                            db-type: mysql
                            # 開啟慢sql監控,超過2s 就認為是慢sql,記錄到日志中
                            log-slow-sql: true
                            slow-sql-millis: 2000
                          # 日志監控,使用slf4j 進行日志輸出
                          slf4j:
                            enabled: true
                            statement-log-error-enabled: true
                            statement-create-after-log-enabled: false
                            statement-close-after-log-enabled: false
                            result-set-open-after-log-enabled: false
                            result-set-close-after-log-enabled: false
                        ########## 配置WebStatFilter,用于采集web關聯監控的數據 ##########
                        web-stat-filter:
                          enabled: true                   # 啟動 StatFilter
                          url-pattern: /* # 過濾所有url
                          exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" # 排除一些不必要的url
                          session-stat-enable: true       # 開啟session統計功能
                          session-stat-max-count: 1000 # session的最大個數,默認100
                        ########## 配置StatViewServlet(監控頁面),用于展示Druid的統計信息 ##########
                        stat-view-servlet:
                          enabled: true                   # 啟用StatViewServlet
                          url-pattern: /druid/* # 訪問內置監控頁面的路徑,內置監控頁面的首頁是/druid/index.html
                          reset-enable: false              # 不允許清空統計數據,重新計算
                          login-username: root # 配置監控頁面訪問密碼
                          login-password: 123
                          allow: 127.0.0.1 # 允許訪問的地址,如果allow沒有配置或者為空,則允許所有訪問
                          deny: # 拒絕訪問的地址,deny優先于allow,如果在deny列表中,就算在allow列表中,也會被拒絕
                  

                  上述配置文件的參數可以在 com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties org.springframework.boot.autoconfigure.jdbc.DataSourceProperties中找到;

                  1.3.1 如何配置 Filter

                  可以通過spring.datasource.druid.filters=stat,wall,log4j ...的方式來啟用相應的內置Filter,不過這些Filter都是默認配置。如果默認配置不能滿足需求,可以放棄這種方式,通過配置文件來配置Filter,下面是例子。

                  # 配置StatFilter
                  spring.datasource.druid.filter.stat.enabled=true
                  spring.datasource.druid.filter.stat.db-type=h2
                  spring.datasource.druid.filter.stat.log-slow-sql=true
                  spring.datasource.druid.filter.stat.slow-sql-millis=2000
                  
                  # 配置WallFilter
                  spring.datasource.druid.filter.wall.enabled=true
                  spring.datasource.druid.filter.wall.db-type=h2
                  spring.datasource.druid.filter.wall.config.delete-allow=false
                  spring.datasource.druid.filter.wall.config.drop-table-allow=false
                  

                  目前為以下 Filter 提供了配置支持,根據(spring.datasource.druid.filter.*)進行配置。

                  StatFilter
                  WallFilter
                  ConfigFilter
                  EncodingConvertFilter
                  Slf4jLogFilter
                  Log4jFilter
                  Log4j2Filter
                  CommonsLogFilter
                  不想使用內置的 Filters,要想使自定義 Filter 配置生效需要將對應 Filterenabled 設置為 true ,Druid Spring Boot Starter 默認禁用 StatFilter,可以將其 enabled 設置為 true 來啟用它。

                  1.4 監控頁面

                  啟動項目后,訪問/druid/login.html來到登錄頁面,輸入用戶名密碼登錄
                  在這里插入圖片描述
                  數據源頁面 是當前DataSource配置的基本信息,上述配置的Filter可以在里面找到,如果沒有配置Filter(一些信息會無法統計,例如“SQL監控”,會無法獲取JDBC相關的SQL執行信息)
                  在這里插入圖片描述

                  SQL監控頁面,統計了所有SQL語句的執行情況

                  在這里插入圖片描述

                  URL監控頁面,統計了所有Controller接口的訪問以及執行情況
                  在這里插入圖片描述

                  Spring 監控頁面,利用aop 對指定接口的執行時間,jdbc數進行記錄

                  在這里插入圖片描述
                  SQL防火墻頁面
                  druid提供了黑白名單的訪問,可以清楚的看到sql防護情況。

                  Session監控頁面
                  可以看到當前的session狀況,創建時間、最后活躍時間、請求次數、請求時間等詳細參數。

                  JSONAPI 頁面
                  通過api的形式訪問Druid的監控接口,api接口返回Json形式數據。

                  1.5 sql監控

                  配置 Druid web 監控 filterWebStatFilter)這個過濾器,作用就是統計 web 應用請求中所有的數據庫信息,比如 發出的 sql 語句,sql執行的時間、請求次數、請求的 url 地址、以及seesion監控、數據庫表的訪問次數 等等。

                  spring:
                    datasource:
                      druid:
                        ########## 配置WebStatFilter,用于采集web關聯監控的數據 ##########
                        web-stat-filter:
                          enabled: true                   # 啟動 StatFilter
                          url-pattern: /* # 過濾所有url
                          exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*" # 排除一些不必要的url
                          session-stat-enable: true       # 開啟session統計功能
                          session-stat-max-count: 1000 # session的最大個數,默認100
                  

                  1.6 慢sql記錄

                  有時候,系統中有些SQL執行很慢,我們希望使用日志記錄下來,可以開啟Druid的慢SQL記錄功能

                  spring:
                    datasource:
                      druid:
                        filter:
                          stat:
                            enabled: true # 開啟DruidDataSource狀態監控
                            db-type: mysql # 數據庫的類型
                            log-slow-sql: true # 開啟慢SQL記錄功能
                            slow-sql-millis: 2000 # 默認3000毫秒,這里超過2s,就是慢,記錄到日志
                  

                  啟動后,如果遇到執行慢的SQL,便會輸出到日志中。

                  1.7 spring 監控

                  訪問之后spring監控默認是沒有數據的;這需要導入SprngBootAOPStarter

                  <!--SpringBoot 的aop 模塊-->
                  <dependency>
                      <groupId>org.springframework.boot</groupId>
                      <artifactId>spring-boot-starter-aop</artifactId>
                  </dependency>
                  

                  需要在 application.yml 配置:
                  Spring監控AOP切入點,如com.springboot.template.dao.*,(配置多個英文逗號分隔)

                  spring.datasource.druid.aop-patterns="com.springboot.template.dao.*"
                  

                  1.8 去 Ad(廣告)

                  訪問監控頁面的時候,可能會在頁面底部(footer)看到阿里巴巴的廣告

                  原因:引入的druid的jar包中的common.js(里面有一段js代碼是給頁面的footer追加廣告的)
                  如果想去掉,有兩種方式:

                  1. 直接手動注釋這段代碼
                    如果是使用Maven,直接到本地倉庫中,查找這個jar包
                    要注釋的代碼:
                  // this.buildFooter();
                  

                  common.js的位置:

                  com/alibaba/druid/1.1.23/druid-1.1.23.jar!/support/http/resources/js/common.js

                  1. 使用過濾器過濾

                  注冊一個過濾器,過濾common.js的請求,使用正則表達式替換相關的廣告內容

                  @Configuration
                  @ConditionalOnWebApplication
                  @AutoConfigureAfter(DruidDataSourceAutoConfigure.class)
                  @ConditionalOnProperty(name = "spring.datasource.druid.stat-view-servlet.enabled",
                  havingValue = "true", matchIfMissing = true)
                  public class RemoveDruidAdConfig {
                  
                      /**
                      * 方法名: removeDruidAdFilterRegistrationBean
                      * 方法描述 除去頁面底部的廣告
                      * @param properties com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties
                      * @return org.springframework.boot.web.servlet.FilterRegistrationBean
                      */
                      @Bean
                      public FilterRegistrationBean removeDruidAdFilterRegistrationBean(DruidStatProperties properties) {
                  
                          // 獲取web監控頁面的參數
                          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";
                  
                          //創建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);
                                  // 重置緩沖區,響應頭不會被重置
                                  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;
                      }
                  }
                  

                  兩種方式都可以,建議使用的是第一種,從根源解決

                  1.9 獲取Druid的監控數據

                  Druid的監控數據可以在開啟StatFilter后,通過DruidStatManagerFacade進行獲取;
                  DruidStatManagerFacade#getDataSourceStatDataList該方法可以獲取所有數據源的監控數據,
                  除此之外 DruidStatManagerFacade 還提供了一些其他方法,可以按需選擇使用

                  @RestController
                  @RequestMapping(value = "/druid")
                  public class DruidStatController {
                  
                      @GetMapping("/stat")
                      public Object druidStat(){
                          // 獲取數據源的監控數據
                          return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
                      }
                  }
                  

                  雖然 HikariCP 的速度稍快,但是,Druid能夠提供強大的監控和擴展功能,也是阿里巴巴的開源項目。

                  Druid是阿里巴巴開發的號稱為監控而生的數據庫連接池,在功能、性能、擴展性方面,都超過其他數據庫連接池

                  轉載于:https://mp.weixin.qq.com/s/rc1Y2u8qD8hRoMhbqhFmRA

                  2 監控mybatis-plus下SQL

                  2.1 pom.xml

                  <dependency>
                              <groupId>org.springframework.boot</groupId>
                              <artifactId>spring-boot-starter-web</artifactId>
                          </dependency>
                          <dependency>
                              <groupId>org.projectlombok</groupId>
                              <artifactId>lombok</artifactId>
                              <optional>true</optional>
                          </dependency>
                   
                          <dependency>
                              <groupId>mysql</groupId>
                              <artifactId>mysql-connector-java</artifactId>
                              <version>5.1.47</version>
                          </dependency>
                          <dependency>
                              <groupId>com.alibaba</groupId>
                              <artifactId>druid</artifactId>
                              <version>1.1.10</version>
                          </dependency>
                          <!--注意引入druid需要引入log4j,不然會報錯-->
                          <dependency>
                              <groupId>log4j</groupId>
                              <artifactId>log4j</artifactId>
                              <version>1.2.17</version>
                          </dependency>
                          <dependency>
                              <groupId>com.baomidou</groupId>
                              <artifactId>mybatis-plus-boot-starter</artifactId>
                              <version>3.2.0</version>
                          </dependency>
                  

                  2.2 application.yml

                  spring:
                    datasource:
                      username: root
                      password: 123456
                      url: jdbc:mysql://localhost/springboot?characterEncoding=utf-8&useSSl=false
                      driver-class-name: com.mysql.jdbc.Driver
                      type: com.alibaba.druid.pool.DruidDataSource
                      #監控統計攔截的filters
                      filters: stat,wall,log4j
                      #druid配置
                      #配置初始化大小/最小/最大
                      initialSize: 5
                      minIdle: 5
                      maxActive: 20
                      #獲取連接等待超時時間
                      maxWait: 60000
                      #間隔多久進行一次檢測,檢測需要關閉的空閑連接
                      timeBetweenEvictionRunsMillis: 60000
                      #一個連接在池中最小生存的時間
                      minEvictableIdleTimeMillis: 300000
                      validationQuery: SELECT 1 FROM DUAL
                      testWhileIdle: true
                      testOnBorrow: false
                      testOnReturn: false
                      #打開PSCache,并指定每個連接上PSCache的大小。oracle設為true,mysql設為false。分庫分表較多推薦設置為false
                      poolPreparedStatements: false
                      maxPoolPreparedStatementPerConnectionSize: 20
                      # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
                      connectionProperties:
                        druid:
                          stat:
                            mergeSql: true
                            slowSqlMillis: 5000
                   
                  #mybatis是獨立節點,需要單獨配置
                  mybatis-plus:
                    mapper-locations: classpath*:mapper/*.xml
                    type-aliases-package: com.frank.securityjwt.entity
                    configuration:
                      map-underscore-to-camel-case: true
                  

                  2.3 相關配置信息

                  import com.alibaba.druid.pool.DruidDataSource;
                  import com.alibaba.druid.support.http.StatViewServlet;
                  import com.alibaba.druid.support.http.WebStatFilter;
                  import org.springframework.boot.context.properties.ConfigurationProperties;
                  import org.springframework.boot.web.servlet.FilterRegistrationBean;
                  import org.springframework.boot.web.servlet.ServletRegistrationBean;
                  import org.springframework.context.annotation.Bean;
                  import org.springframework.context.annotation.Configuration;
                  import org.springframework.context.annotation.PropertySource;
                  
                  import javax.sql.DataSource;
                  
                  @Configuration
                  @PropertySource(value = "classpath:application.yml")
                  public class DruidConfiguration {
                      /**
                       * @todo 數據源配置
                       */
                      @Bean(destroyMethod = "close", initMethod = "init")
                      @ConfigurationProperties(prefix = "spring.datasource")
                      public DataSource druidDataSource() {
                          DruidDataSource druidDataSource = new DruidDataSource();
                          return druidDataSource;
                      }
                  
                      /**
                       * druid
                       * 注冊一個StatViewServlet
                       * @return
                       */
                      @Bean
                      public ServletRegistrationBean druidStatViewServlet(){
                          //org.springframework.boot.context.embedded.ServletRegistrationBean提供類的進行注冊.
                          ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
                  
                          //添加初始化參數:initParams
                          //白名單:
                          servletRegistrationBean.addInitParameter("allow","127.0.0.1");
                          //IP黑名單 (存在共同時,deny優先于allow) : 如果滿足deny的話提示:Sorry, you are not permitted to view this page.
                          //servletRegistrationBean.addInitParameter("deny","192.168.1.73");
                          //登錄查看信息的賬號密碼.
                          servletRegistrationBean.addInitParameter("loginUsername","admin");
                          servletRegistrationBean.addInitParameter("loginPassword","123456");
                          //是否能夠重置數據.
                          servletRegistrationBean.addInitParameter("resetEnable","false");
                          return servletRegistrationBean;
                      }
                  
                      /**
                       * druid過濾器
                       * 注冊一個:filterRegistrationBean
                       * @return
                       */
                      @Bean
                      public FilterRegistrationBean druidStatFilter(){
                          FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
                          //添加過濾規則.
                          filterRegistrationBean.addUrlPatterns("/*");
                          //添加不需要忽略的格式信息.
                          filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
                          return filterRegistrationBean;
                      }
                  }
                  
                  隨時隨地學軟件編程-關注百度小程序和微信小程序
                  關于找一找教程網

                  本站文章僅代表作者觀點,不代表本站立場,所有文章非營利性免費分享。
                  本站提供了軟件編程、網站開發技術、服務器運維、人工智能等等IT技術文章,希望廣大程序員努力學習,讓我們用科技改變世界。
                  [SpringBoot使用Druid監控SQL]http://www.yachtsalesaustralia.com/tech/detail-318774.html

                  贊(0)
                  關注微信小程序
                  程序員編程王-隨時隨地學編程

                  掃描二維碼或查找【程序員編程王】

                  可以隨時隨地學編程啦!

                  技術文章導航 更多>
                  国产在线拍揄自揄视频菠萝

                        1. <dd id="erndk"></dd>