忙里偷個閑,在這里分享一下SpringBoot集成Druid實現數據庫監控功能,有什么錯誤歡迎大家指出!
參考文件:
Spring實現Druid監控:https://www.cnblogs.com/wanghuijie/p/druid_monitor.html
DruidDataSource源碼分析:https://www.cnblogs.com/wanghuijie/p/druiddatasource.html
保存Druid監控日志:https://www.cnblogs.com/wanghuijie/p/druid_stat_log.html
言歸正傳,看看是怎么實現的吧。
一:引入Druid依賴

1 <dependency> 2 <groupId>com.alibaba</groupId> 3 <artifactId>druid</artifactId> 4 <version>1.0.31</version> 5 </dependency>
二:在yml中添加druid配置

1 spring: 2 datasource: 3 # 配置多數據源時使用 4 main: 5 name: AA 6 driver-class-name: com.mysql.jdbc.Driver 7 # 對應自己的數據庫連接 8 url: jdbc:mysql:// 9 username: xxx 10 password: xxx 11 # Druid連接池的配置信息 Begin ################################################## 12 type: com.alibaba.druid.pool.DruidDataSource 13 #初始化連接大小 14 initialSize: 5 15 #最小連接池數量 16 minIdle: 5 17 #最大連接池數量 18 maxActive: 20 19 maxIdle: 20 20 # 配置獲取連接等待超時的時間 21 maxWait: 60000 22 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 23 timeBetweenEvictionRunsMillis: 60000 24 # 配置一個連接在池中最小生存的時間,單位是毫秒 25 minEvictableIdleTimeMillis: 300000 26 # 測試連接 27 validationQuery: SELECT 1 FROM DUAL 28 # 申請連接的時候檢測,建議配置為true,不影響性能,並且保證安全性 29 testWhileIdle: true 30 # 獲取連接時執行檢測,建議關閉,影響性能 31 testOnBorrow: false 32 # 歸還連接時執行檢測,建議關閉,影響性能 33 testOnReturn: false 34 # 是否開啟PSCache,PSCache對支持游標的數據庫性能提升巨大,oracle建議開啟,mysql下建議關閉 35 poolPreparedStatements: false 36 # 開啟poolPreparedStatements后生效 37 maxPoolPreparedStatementPerConnectionSize: 20 38 # 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用於防火牆 39 filters: stat,wall,log4j 40 logSlowSql: true 41 # Druid連接池的配置信息 End ######################################################
三: 使用java代碼讀取配置

1 package com.bjgoodwill.oip.hosp.practice.druid; 2 3 import com.alibaba.druid.pool.DruidDataSource; 4 import com.alibaba.druid.support.http.StatViewServlet; 5 import com.alibaba.druid.support.http.WebStatFilter; 6 import org.apache.commons.lang3.StringUtils; 7 import org.springframework.beans.factory.annotation.Value; 8 import org.springframework.boot.web.servlet.FilterRegistrationBean; 9 import org.springframework.boot.web.servlet.ServletRegistrationBean; 10 import org.springframework.context.annotation.Bean; 11 import org.springframework.context.annotation.Configuration; 12 import org.springframework.context.annotation.Primary; 13 14 import javax.sql.DataSource; 15 import java.sql.SQLException; 16 17 @Configuration 18 public class DruidSourceConfig { 19 20 // 有多數據源時可調為多數據源的配置,如@Value("${spring.datasource.main.name}") 21 @Value("${spring.datasource.name}") 22 private String mainName; 23 24 @Value("${spring.datasource.url}") 25 private String mainUrl; 26 27 @Value("${spring.datasource.username}") 28 private String mainUsername; 29 30 @Value("${spring.datasource.password}") 31 private String mainPassword; 32 33 @Value("${spring.datasource.driver-class-name}") 34 private String mainDriverClassName; 35 36 @Value("${spring.datasource.initialSize}") 37 private String mainInitialSize; 38 39 @Value("${spring.datasource.minIdle}") 40 private String mainMinIdle; 41 42 @Value("${spring.datasource.maxActive}") 43 private String mainMaxActive; 44 45 @Value("${spring.datasource.maxWait}") 46 private String mainMaxWait; 47 48 @Value("${spring.datasource.timeBetweenEvictionRunsMillis}") 49 private String mainTimeBetweenEvictionRunsMillis; 50 51 @Value("${spring.datasource.minEvictableIdleTimeMillis}") 52 private String mainMinEvictableIdleTimeMillis; 53 54 @Value("${spring.datasource.validationQuery}") 55 private String mainValidationQuery; 56 57 @Value("${spring.datasource.filters}") 58 private String mainFilters; 59 60 @Value("{spring.datasource.logSlowSql}") 61 private String mainLogSlowSql; 62 63 @Value("${spring.datasource.type}") 64 private String mainType; 65 66 @Value("{spring.datasource.maxIdle}") 67 private String mainMaxIdle; 68 69 @Bean 70 @Primary 71 public DataSource mainDataSource() { 72 DruidDataSource datasource = new DruidDataSource(); 73 74 datasource.setUrl(mainUrl); 75 datasource.setUsername(mainUsername); 76 datasource.setPassword(mainPassword); 77 datasource.setDriverClassName(mainDriverClassName); 78 79 //configuration 80 if (StringUtils.isNotBlank(mainInitialSize)) { 81 datasource.setInitialSize(Integer.parseInt(mainInitialSize)); 82 } 83 if (StringUtils.isNotBlank(mainMinIdle)) { 84 datasource.setMinIdle(Integer.parseInt(mainMinIdle)); 85 } 86 if (StringUtils.isNotBlank(mainMaxActive)) { 87 datasource.setMaxActive(Integer.parseInt(mainMaxActive)); 88 } 89 if (StringUtils.isNotBlank(mainMaxWait)) { 90 datasource.setMaxWait(Integer.parseInt(mainMaxWait)); 91 } 92 if (StringUtils.isNotBlank(mainTimeBetweenEvictionRunsMillis)) { 93 datasource.setTimeBetweenEvictionRunsMillis(Integer.parseInt(mainTimeBetweenEvictionRunsMillis)); 94 } 95 if (StringUtils.isNotBlank(mainMinEvictableIdleTimeMillis)) { 96 datasource.setMinEvictableIdleTimeMillis(Integer.parseInt(mainMinEvictableIdleTimeMillis)); 97 } 98 99 datasource.setValidationQuery(mainValidationQuery); 100 datasource.setTestWhileIdle(true); 101 datasource.setTestOnBorrow(false); 102 datasource.setTestOnReturn(false); 103 try { 104 datasource.setFilters(mainFilters); 105 } catch (SQLException e) { 106 e.printStackTrace(); 107 } 108 return datasource; 109 } 110 111 @Bean 112 public ServletRegistrationBean statViewServlet(){ 113 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*"); 114 //設置ip白名單 115 servletRegistrationBean.addInitParameter("allow",""); 116 //設置ip黑名單,優先級高於白名單 117 servletRegistrationBean.addInitParameter("deny",""); 118 //設置控制台管理用戶 119 servletRegistrationBean.addInitParameter("loginUsername","root"); 120 servletRegistrationBean.addInitParameter("loginPassword","root"); 121 //是否可以重置數據 122 servletRegistrationBean.addInitParameter("resetEnable","false"); 123 return servletRegistrationBean; 124 } 125 126 @Bean 127 public FilterRegistrationBean statFilter(){ 128 //創建過濾器 129 FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); 130 //設置過濾器過濾路徑 131 filterRegistrationBean.addUrlPatterns("/*"); 132 //忽略過濾的形式 133 filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); 134 return filterRegistrationBean; 135 }
四: 執行效果