数据库操作–开启Durid 监控
整合Druid 到Spring-Boot
官方文档
使用手册: https://github.com/alibaba/druid
- 中文手册: https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
- English手册: https://github.com/alibaba/druid/wiki/FAQ
- Druid Spring Boot Starter 手册:https://github.com/alibaba/druid/tree/master/druid-spring-boot-starter
基本介绍
-
HiKariCP: 目前市面上非常优秀的数据源, 是springboot2 默认数据源。
-
Druid: 性能优秀,Druid 提供性能卓越的连接池功能外【Java 基础】,还集成了SQL 监控,黑名单拦截等功能,强大的监控特性,通过Druid 提供的监控功能,可以清楚知道连接池和SQL 的工作情况,所以根据项目需要,我们也要掌握Druid 和SpringBoot 整合。
-
整合Druid 到Spring-Boot 方式
● 自定义方式
● 引入starter 方式
Durid 基本使用
需求: 将Spring-Boot 的数据源切换成Druid
代码实现
1.修改pom.xml , 引入druid 依赖
<!-- 引入druid 依赖-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.17</version>
</dependency>
2.创建com/nlc/usersys/config/DruidDataSourceConfig.java 配置类
@Configuration
public class DruidDataSourceConfig {
//编写方法,注入DruidDataSource
//说明:为什么我们注入自己的DataSource , 默认的HiKariDatasource失效?
//1. 默认的数据源是如配置? @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
// 解读:通过@ConditionalOnMissingBean({ DataSource.class}) 判断如果容器有DataSource Bean 就不注入默认的HiKariDatasource
//2. debug源码.
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
//1. 配置了 @ConfigurationProperties("spring.datasource")
// 就可以读取到application.yml的配置
//2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联
DruidDataSource druidDataSource = new DruidDataSource();
// druidDataSource.setUrl("jdbc:mysql://localhost:3306/furn_ssm?useSSL=true&useUnicode=true&characterEncoding=UTF-8");
// druidDataSource.setUsername("root");
// druidDataSource.setPassword("123456");
return druidDataSource;
}
}
- 完成测试,运行ApplicationTests.java , 观察数据源的运行类型
Durid 监控功能-SQL 监控
需求:
配置Druid 的监控功能,包括SQL 监控、SQL 防火墙、Web 应用、Session 监控等
SQL 监控数据
- 修改com/nlc/usersys/config/DruidDataSourceConfig.java , 增加druid 监控功能
地址:https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
@Configuration
public class DruidDataSourceConfig {
//编写方法,注入DruidDataSource
//说明:为什么我们注入自己的DataSource , 默认的HiKariDatasource失效?
//1. 默认的数据源是如配置? @ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
// 解读:通过@ConditionalOnMissingBean({ DataSource.class}) 判断如果容器有DataSource Bean 就不注入默认的HiKariDatasource
//2. debug源码.
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
//1. 配置了 @ConfigurationProperties("spring.datasource")
// 就可以读取到application.yml的配置
//2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联
DruidDataSource druidDataSource = new DruidDataSource();
// druidDataSource.setUrl("jdbc:mysql://localhost:3306/furn_ssm?useSSL=true&useUnicode=true&characterEncoding=UTF-8");
// druidDataSource.setUsername("root");
// druidDataSource.setPassword("123456");
return druidDataSource;
}
//配置druid的监控页功能
@Bean
public ServletRegistrationBean statViewServlet() {
//创建StatViewServlet
StatViewServlet statViewServlet = new StatViewServlet();
ServletRegistrationBean<StatViewServlet> registrationBean =
new ServletRegistrationBean<>(statViewServlet, "/druid/*");
//设置init-parameter, 设置用户名和密码
registrationBean.addInitParameter("loginUsername", "hhh");
registrationBean.addInitParameter("loginPassword", "666666");
return registrationBean;
}
}
- 完成测试: 访问http://localhost:10000/druid/index.html 不会被拦截, 如果没有问题,会看到这个页面
-
修改com/nlc/usersys/config/DruidDataSourceConfig.java , 加入监控功能
参考: https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
@ConfigurationProperties("spring.datasource")
@Bean
public DataSource dataSource() throws SQLException {
//1. 配置了 @ConfigurationProperties("spring.datasource")
// 就可以读取到application.yml的配置
//2. 我们就不需要调用DruidDataSource 对象的setXxx, 会自动关联
DruidDataSource druidDataSource = new DruidDataSource();
// druidDataSource.setUrl("jdbc:mysql://localhost:3306/furn_ssm?useSSL=true&useUnicode=true&characterEncoding=UTF-8");
// druidDataSource.setUsername("root");
// druidDataSource.setPassword("123456");
//加入监控功能, 加入了sql防火墙监控
druidDataSource.setFilters("stat,wall");
return druidDataSource;
}
- 创建com/nlc/usersys/controller/DruidSqlController.java ,模拟操作DB 的请求
@Controller
public class DruidSqlController {
@Resource
private JdbcTemplate jdbcTemplate;
@ResponseBody
@GetMapping("/sql")
public List<Furn> crudDB() {
BeanPropertyRowMapper<Furn> rowMapper = new BeanPropertyRowMapper<>(Furn.class);
List<Furn> furns = jdbcTemplate.query("select * from `furn`", rowMapper);
for (Furn furn : furns) {
System.out.println(furn);
}
return furns;
}
}
SQL 监控数据-测试页面
完成测试, 观察SQL 监控数据, 浏览器输入http://localhost:10000/druid/sql.html
各项的含义,请参考druid文档
登陆后请求SQL路径
Durid 监控功能-Web 关联监控
需求:
配置Web 关联监控配置:Web 应用、URI 监控
官方文档https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
Web 关联监控配置-Web 应用、URI 监控
- 修改com/nlc/usersys/config/DruidDataSourceConfig.java , 注入/ 增加WebStatFilter 用于采集web-jdbc 关联监控的数据
//配置WebStatFilter, 用于采集web-jdbc关联的监控数据
@Bean
public FilterRegistrationBean webStatFilter() {
//创建 WebStatFilter
WebStatFilter webStatFilter = new WebStatFilter();
FilterRegistrationBean<WebStatFilter> filterRegistrationBean =
new FilterRegistrationBean<>(webStatFilter);
//默认对所有的url请求进行监控
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
//排除指定的url
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
- 为了测试方便,修改com/nlc/usersys/config/WebConfig.java, 放行/sql 请求
@Configuration
public class WebConfig /*implements WebMvcConfigurer*/ {
@Bean
public WebMvcConfigurer webMvcConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addInterceptors(InterceptorRegistry registry) {
System.out.println("addInterceptors~~~");
//注册拦截器
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**")
.excludePathPatterns("/","/login","/images/**","/upload.html","/upload","/sql");
}
};
}
}
重启项目
完成测试,重启项目,看看Web 应用和URI 监控是否生效
Durid 监控功能-SQL 防火墙
需求: 配置SQL 防火墙
官方文档https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
SQL 防火墙
- 修改com/nlc/usersys/config/DruidDataSourceConfig.java ,加入防火墙监控
- 完成测试,重启项目,看看SQL 防火墙监控是否生效
Durid 监控功能-Session 监控
需求: 配置Session 监控
官方文档https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
Session 监控
- 重启项目, 先登录管理系统
- 完成测试, 查看监控页需要输入用户名和密码, 点击Session 监控,可以看到相关信息(注意要登录用户系统,才能看到Session 监控信息)
Druid Spring Boot Starter
基本介绍
- 前面我们使用的是自己引入druid+配置类方式整合Druid 和监控
- Druid Spring Boot Starter 可以让程序员在Spring Boot 项目中更加轻松集成Druid 和监控
应用实例
需求: 使用Druid Spring Boot Starter 方式完成Druid 集成和监控
具体实现
- 修改pom.xml 注销druid 的依赖
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>druid-spring-boot-starter</artifactId>-->
<!-- <version>1.1.17</version>-->
<!-- </dependency>-->
-
注销com/nlc/usersys/config/DruidDataSourceConfig.java
-
这时测试,druid 失效
- 查看druid 文档https://github.com/alibaba/druid,引入druid starter
- 确认druid starter 引入哪些依赖
- 修改resources/application.yml 增加配置参数
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 50MB
datasource: #配置数据源
# 说明: 如果你没有指定useSSL=true ,启动项目会报红警告, 环境的问题,需要灵活处理
url: jdbc:mysql://localhost:3306/furn_ssm?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
#配置druid和监控功能
druid:
stat-view-servlet:
enabled: true
login-username: jack
login-password: 666
reset-enable: false
web-stat-filter: #配置web监控
enabled: true
url-pattern: /*
exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'
filter:
stat: #sql监控
slow-sql-millis: 1000
log-slow-sql: true
enabled: true
wall: #配置sql防火墙
enabled: true
config:
drop-table-allow: false
select-all-column-allow: false
重启项目,完成测试
完成测试