springboot整合Druid
工具:
- idea21.6版
- spring boot2.7
- MySQL8.5
第一步:注入druid依赖
两种方式:单独注入druid依赖或者注入druid的stater包。两者均可
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.16</version>
</dependency>
第二步:设置datasource
在springboot的yaml配置文件中添加datasource注册驱动、地址、账号密码等。
注意
:需要切换成druid的数据源,因为Spring Boot 2.0 以上默认使用 com.zaxxer.hikari.HikariDataSource 数据源,但可以通过 spring.datasource.type 指定成druid数据源。
spring:
datasource:
#数据库地址
url: jdbc:mysql://localhost:3306/school?
useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=ShangHai
#注册驱动
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: root
#设置type为durid连接池的数据源
type: com.alibaba.druid.pool.DruidDataSource
#数据源其他配置
druid:
#配置初始化大小、最小、最大线程数
initialSize: 5
minIdle: 5
#CPU核数+1,也可以大些但不要超过20,数据库加锁时连接过多性能下降
maxActive: 20
#最大等待时间,内网:800,外网:1200(三次握手1s)
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
#配置一个连接在池中最大空间时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1
testWhileIdle: true
#设置从连接池获取连接时是否检查连接有效性,true检查,false不检查
testOnBorrow: true
#设置从连接池归还连接时是否检查连接有效性,true检查,false不检查
testOnReturn: true
#可以支持PSCache(提升写入、查询效率)
poolPreparedStatements: true
#配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall,log4j
#保持长连接
keepAlive: true
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
测试
在test包下写测试,注入DataSource
并打印出来,发现已经转换成了DruidDataSource
说明转换成功。
@SpringBootTest(classes = TeamBootApplication.class)
public class JdbcTest {
@Autowired
DataSource dataSource;//dataSource标红但可正常运行
@Test
void JdbcTest1(){
System.out.println(dataSource.getClass().toString());
}
}
第三步:编写DruidDataSource配置类
虽然我们已经指定了Druid的数据源,
但是还需要将将全局配置文件中的参数绑定到DruidDataSource并添加到容器。
所以我们需要关闭springboot的数据源自动装配,修改成Druid的数据源并配置相关功能。
分为如下几步:
1: 启动类关闭数据源的自动装配
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
2: 编写druid
的配置类
@Configuration
public class DruidConfig {
@Bean
/**
*将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建,
*绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource
*从而让它们生效。
*@ConfigurationProperties(prefix = "spring.datasource"):
*作用就是将 全局配置文件中 前缀为 spring.datasource的属性值注入到
*com.alibaba.druid.pool.DruidDataSource 的同名参数中
**/
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource DruidDataSource(){
return new DruidDataSource();
}
}
到这一步druid的配置属性才生效,可在测试类中dataSource.getInitialSize()查看
3: 在druid的配置类中添加数据源监控
和filter
过滤器
-
Druid 数据源具有监控的功能,并提供了一个 web 界面方便用户查看,类似安装 路由器 时,人家也提供了一个默认的 web 页面。
所以需要设置 Druid 的后台管理页面,比如 登录账号、密码 等;配置后台管理; -
而
filter
过滤器用于配置Web和Druid数据源之间的管理关联监控统计;
//配置 Druid 监控管理后台的Servlet;
//内置 Servlet 容器时没有web.xml文件,所以使用 Spring Boot 的注册 Servlet 方式
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet
// 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername", "admin"); //后台管理界面的登录账号,名字固定
initParams.put("loginPassword", "123456"); //后台管理界面的登录密码,名字固定
//后台允许谁可以访问
//initParams.put("allow", "localhost"):表示只有本机可以访问
//initParams.put("allow", ""):为空或者为null时,表示允许所有访问
initParams.put("allow", "");
//deny:Druid 后台拒绝谁访问
//initParams.put("kuangshen", "192.168.1.20");表示禁止此ip访问
//设置初始化参数
bean.setInitParameters(initParams);
return bean;
}
在浏览器输入http://localhost:8080/druid/login.html
进入druid监控登录界面,若点击登录没有反应,查看控制台,大概率是参数 k 错误
//配置 Druid 监控 之 web 监控的 filter
//WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
//exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");
bean.setInitParameters(initParams);
//"/*" 表示过滤所有请求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}