使用手册: https://github.com/alibaba/druid
HiKariCP: 目前市面上非常优秀的数据源, 是springboot2 默认数据源。
Druid: 性能优秀,Druid 提供性能卓越的连接池功能外【Java 基础】,还集成了SQL 监控,黑名单拦截等功能,强大的监控特性,通过Druid 提供的监控功能,可以清楚知道连接池和SQL 的工作情况,所以根据项目需要,我们也要掌握Druid 和SpringBoot 整合。
整合Druid 到Spring-Boot 方式
● 自定义方式
● 引入starter 方式
需求: 将Spring-Boot 的数据源切换成Druid
1.修改pom.xml , 引入druid 依赖
com.alibaba druid 1.1.17
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; } }
配置Druid 的监控功能,包括SQL 监控、SQL 防火墙、Web 应用、Session 监控等
地址: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(); ServletRegistrationBeanregistrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*"); //设置init-parameter, 设置用户名和密码 registrationBean.addInitParameter("loginUsername", "hhh"); registrationBean.addInitParameter("loginPassword", "666666"); return registrationBean; } }
修改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; }
@Controller public class DruidSqlController { @Resource private JdbcTemplate jdbcTemplate; @ResponseBody @GetMapping("/sql") public ListcrudDB() { BeanPropertyRowMapper rowMapper = new BeanPropertyRowMapper<>(Furn.class); List furns = jdbcTemplate.query("select * from `furn`", rowMapper); for (Furn furn : furns) { System.out.println(furn); } return furns; } }
完成测试, 观察SQL 监控数据, 浏览器输入http://localhost:10000/druid/sql.html
各项的含义,请参考druid文档
登陆后请求SQL路径
配置Web 关联监控配置:Web 应用、URI 监控
官方文档https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
//配置WebStatFilter, 用于采集web-jdbc关联的监控数据 @Bean public FilterRegistrationBean webStatFilter() { //创建 WebStatFilter WebStatFilter webStatFilter = new WebStatFilter(); FilterRegistrationBeanfilterRegistrationBean = new FilterRegistrationBean<>(webStatFilter); //默认对所有的url请求进行监控 filterRegistrationBean.setUrlPatterns(Arrays.asList("/*")); //排除指定的url filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; }
@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 监控是否生效
需求: 配置SQL 防火墙
官方文档https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
需求: 配置Session 监控
官方文档https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
需求: 使用Druid Spring Boot Starter 方式完成Druid 集成和监控
注销com/nlc/usersys/config/DruidDataSourceConfig.java
这时测试,druid 失效
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
完成测试