世界上能够生存下来的物种,并不是那些最强壮或最聪明的,而是那些可以适应变化的,能善用周围的物资并合作来对抗共同的威胁的物种。
——达尔文
一 、Druid介绍
Druid是阿里巴巴开源的数据库连接池,是目前Java语言中最好的数据库连接池之一,目前在国内被各大公司广泛使用。Druid 支持所有 JDBC 兼容的数据库,包括 Oracle、MySQL、SQL Server 和 H2 等等。Druid 不仅结合了 C3P0、DBCP 和 PROXOOL 等数据源产品的优点,同时还加入了强大的监控功能。通过 Druid 的监控功能,可以实时观察数据库连接池和 SQL 的运行情况,帮助用户及时排查出系统中存在的问题。Druid能够提供强大的监控和扩展功能。 Druid 不是 Spring Boot 内部提供的技术,它属于第三方技术,我们可以通过以下两种方式进行整合:
1. 自定义整合 Druid
2. 通过 starter 整合 Druid
二、Spring boot 整合 Druid
2.1 添加Druid依赖
com.alibaba
druid-spring-boot-starter
1.2.15
2.2 添加配置application.yaml
spring:
datasource:
username: root
password: holmium
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/holmium?useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=Asia/Shanghai
type: com.alibaba.druid.pool.DruidDataSource
# 数据源连接池配置
druid:
# 数据源其他配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.logSlowSql=true;druid.stat.slowSqlMillis=1000;
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,slf4j
#配置监控属性: 在druid-starter的: com.alibaba.druid.spring.boot.autoconfigure.stat包下进行的逻辑配置
# WebStatFilter配置,
web-stat-filter:
#默认为false,表示不使用WebStatFilter配置,就是属性名去短线
enabled: true
#拦截该项目下的一切请求
url-pattern: /*
#对这些请求放行
exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico
session-stat-enable: true
principal-session-name: session_name
principal-cookie-name: cookie_name
# StatViewServlet配置
stat-view-servlet:
#默认为false,表示不使用StatViewServlet配置,就是属性名去短线
enabled: true
#配置DruidStatViewServlet的访问地址。后台监控页面的访问地址
url-pattern: /druid/*
#禁用HTML页面上的“重置”功能,会把所有监控的数据全部清空,一般不使用
reset-enable: false
#监控页面登录的用户名
login-username: admin
#监控页面登录的密码
login-password: 123456
#白名单
allow:
#黑名单
deny:
#Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
aop-patterns: com.zzp.*
2.3 Druid监控
2.3.1 查看监控
启动服务,将http://ip:port/druid/login.html ip和port换成你自己的,copy到浏览器中,输入账号密码,如果数据源页面各项参数和配置的参数一样,则说明集成成功。
注:用户名/密码,就是上述配置文件中的 监控页面登录的用户名 #login-username: admin #监控页面登录的密码 login-password: 123456

具体功能大家可以自行摸索。
2.3.2 去阿里云广告
监控页面中有阿里云广告,如下图,下面我们来去除阿里云广告。

- 创建Druid的config类
package
com.holmium.springboot.config;
import
com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
import
com.alibaba.druid.util.Utils;
import
org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import
org.springframework.boot.web.servlet.FilterRegistrationBean;
import
org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.Configuration;
import javax.servlet.*;
import java.io.IOException;
/**
* @author holmium
* @date 2023/04/20
*/
@Configuration
public class DruidConfig {
/**
* 去除监控页面底部的广告
*/
@SuppressWarnings({"rawtypes", "unchecked"})
@Bean
@ConditionalOnProperty(name = "
spring.datasource.druid.statViewServlet.enabled", havingValue = "true",matchIfMissing = true)
public FilterRegistrationBean
removeDruidFilterRegistrationBean(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("
", "");
text = text.replaceAll("powered.*?shrek.wang", "");
response.getWriter().write(text);
}
@Override
public void destroy() {
}
};
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
registrationBean.setFilter(filter);
registrationBean.addUrlPatterns(commonJsPattern);
return registrationBean;
}
}
- 重启服务 重启服务,我们再访问Druid监控系统,下面的广告已经不见了。 如图

三、总结
本文主要针对Spring Boot 自定义集成Druid,后续文章,我们将通过starter来集成Druid。