SpringBoot使用Druid監控SQL
互聯網 2022/5/2 19:42:58
- 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
默認數據源 HikariDataSource
與 JdbcTemplate
中已經介紹 Spring Boot 2.x
默認使用 Hikari
數據源,可以說 Hikari
與 Driud
都是當前 Java
Web
上最優秀的數據源。
其中的監控器:
stat
:Druid
內置提供一個StatFilter
,用于統計監控信息。wall
:Druid
防御SQL
注入攻擊的WallFilter
就是通過Druid
的SQL 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
監控filter
(WebStatFilter
): 這個過濾器的作用就是統計web
應用請求中所有的數據庫信息,比如 發出的 sql 語句,sql 執行的時間、請求次數、請求的 url 地址、以及seesion 監控、數據庫表的訪問次數 等等。 - 配置
Druid
后臺管理Servlet
(StatViewServlet
):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
配置生效需要將對應 Filter
的 enabled
設置為 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
監控 filter
(WebStatFilter
)這個過濾器,作用就是統計 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
監控默認是沒有數據的;這需要導入SprngBoot
的AOP
的Starter
<!--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
追加廣告的)
如果想去掉,有兩種方式:
- 直接手動注釋這段代碼
如果是使用Maven
,直接到本地倉庫中,查找這個jar包
要注釋的代碼:
// this.buildFooter();
common.js的位置:
com/alibaba/druid/1.1.23/druid-1.1.23.jar!/support/http/resources/js/common.js
- 使用過濾器過濾
注冊一個過濾器,過濾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
- 2022-05-19VS QT 用QT插件不能配置QT的環境,每次配置完成后,再次打開還是未能配置完成
- 2022-05-19543. 二叉樹的直徑
- 2022-05-19第10章_創建和管理表
- 2022-05-19236. 二叉樹的最近公共祖先
- 2022-05-19設計模式之行為型模式-訪問者模式
- 2022-05-19企業微信-代開發自建應用開發
- 2022-05-19監控系統選型,一文輕松搞定!
- 2022-05-19使用Bootstrap搭建頁面(day4)
- 2022-05-19|NO.Z.00004|——————————|BigDataEnd|——————————————————————————————————————————————————————————————————
- 2022-05-19第四章 面向對象(上)4-面向對象的特征一:封裝性