SpringBoot 整合 Druid
1、Druid 简介
-
Druid 是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等 DB 池的优点,同时加入了日志监控。
-
Github地址:https://github.com/alibaba/druid/
2、配置数据源
-
添加 Druid 依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.22</version> </dependency>
-
切换数据源:通过 spring.datasource.type 指定数据源
spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource
-
在测试类中注入 DataSource,获取它看是否切换成功
@Autowired DataSource dataSource; @Test void contextLoads() throws SQLException { // 查看一下默认的数据源:com.alibaba.druid.pool.DruidDataSource System.out.println(dataSource.getClass()); // 获得数据库连接 Connection connection = dataSource.getConnection(); System.out.println(connection); // com.mysql.cj.jdbc.ConnectionImpl@65600fb3 // 关闭 connection.close(); }
切换成功!
-
切换成功后,便可设置数据源连接初始化大小等
spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource #Spring Boot 默认是不注入这些属性值的,需要自己绑定 #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 #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入 #如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j filters: stat,wall,log4j maxPoolPreparedStatementPerConnectionSize: 20 useGlobalDataSourceStat: true connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
-
这里因为使用了 Log4j 日志,所以需要导入依赖
<!-- https://mvnrepository.com/artifact/log4j/log4j --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version> </dependency>
-
为 DuridDataSource 绑定全局配置文件中的参数,并添加到容器中,我们需要自己添加 DuridDataSource 组件到容器中,并绑定属性
DruidConfig
package com.cheng.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.sql.DataSource; @Configuration public class DruidConfig { @ConfigurationProperties(prefix = "spring.datasource") @Bean public DataSource druidDataSource() { return new DruidDataSource(); } }
-
测试是否成功
@Autowired DataSource dataSource; @Test void contextLoads() throws SQLException { // 查看一下默认的数据源 System.out.println(dataSource.getClass()); // 获得数据库连接 Connection connection = dataSource.getConnection(); System.out.println(connection); DruidDataSource druidDataSource = (DruidDataSource) this.dataSource; // druidDataSource 最大连接数 ==> 20 System.out.println("druidDataSource 最大连接数 ==> " + druidDataSource.getMaxActive()); // 关闭 connection.close(); }
测试成功!
3、配置 Druid 数据源监控
Druid 数据源具有监控的功能,并提供了一个 web 界面方便用户查看。
-
设置 Druid 后台管理页
DruidConfig
// 后台监控 @Bean public ServletRegistrationBean startViewServlet() { ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*"); // 后台需要有人登录,账号密码配置 HashMap<String, String> initParameters = new HashMap<>(); // 增加配置 initParameters.put("loginUsername", "admin");// 登录账号 initParameters.put("loginPassword", "123456");// 登录密码 // 允许谁可以访问 initParameters.put("allow", ""); bean.setInitParameters(initParameters);// 设置初始化参数 return bean; }
-
访问后台管理页面
地址:http://localhost:8080/druid/index.html
登录即可!
4、配置 Druid web 监控 filter 过滤器
在 DruidConfig 配置 filter
// Filter
@Bean
public FilterRegistrationBean wenStartFilter() {
FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
bean.setFilter(new WebStatFilter());
// 可以过滤哪些请求
HashMap<String, String> initParameters = new HashMap<>();
// 这些东西不进行统计
initParameters.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");
bean.setInitParameters(initParameters);
// /* 过滤所有请求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}