依赖

  1. <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  2. <dependency>
  3. <groupId>com.alibaba</groupId>
  4. <artifactId>druid</artifactId>
  5. <version>1.2.9</version>
  6. </dependency>

切换数据源

切换数据源;之前已经说过 Spring Boot 2.0 以上默认使用 com.zaxxer.hikari.HikariDataSource 数据源,但可以 通过 spring.datasource.type 指定数据源。

  1. spring:
  2. datasource:
  3. username: root
  4. password: 123456
  5. url: jdbc:mysql://localhost:3306/mybatisdb?useUnicode=true&characterEncoding=utf-8
  6. driver-class-name: com.mysql.jdbc.Driver
  7. #导入依赖过后,指定了type,用的就是druid的数据源
  8. type: com.alibaba.druid.pool.DruidDataSource

测试得到结果

  1. @SpringBootTest
  2. class SpringBoot2jdbcApplicationTests {
  3. @Autowired
  4. DataSource dataSource;//数据源对象,自动装配
  5. @Test
  6. void contextLoads() throws SQLException {
  7. //现在输出的就是:class com.alibaba.druid.pool.DruidDataSource
  8. System.out.println(dataSource.getClass());
  9. //获取数据库链接
  10. Connection connection =dataSource.getConnection();
  11. System.out.println(connection);
  12. //关闭
  13. connection.close();
  14. }
  15. }

设置参数

如上测试结果,既然切换druid成功,就可以设置数据源连接初始化大小、最大连接数、等待时间、最小连接数 等设置项;可以查看源码

  1. spring:
  2. datasource:
  3. username: root
  4. password: 123456
  5. url: jdbc:mysql://localhost:3306/mybatisdb?useUnicode=true&characterEncoding=utf-8
  6. driver-class-name: com.mysql.jdbc.Driver
  7. #导入依赖过后,指定了type,用的就是druid的数据源
  8. type: com.alibaba.druid.pool.DruidDataSource
  9. #springboot 默认不是不注入这些属性值的,需要自己绑定
  10. #druid 数据源专有配置
  11. initialSize: 5
  12. minIdle: 5
  13. maxActive: 20
  14. maxWait: 60000
  15. timeBetweenEvictionRunsMillis: 60000
  16. minEvictableIdleTimeMillis: 300000
  17. validationQuery: SELECT 1 FROM DUAL
  18. testWhileIdle: true
  19. testOnBorrow: false
  20. testOnReturn: false
  21. poolPreparedStatements: true
  22. #配置监控统计拦截的filters,stat:监控统计,log4j(需要导入依赖):日志记录,wall:防御sql注入
  23. filters: stat,wall,log4j
  24. maxPoolPreparedStatementPerConnectionSize: 20
  25. useGlobalDataSourceStat: true
  26. connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

导入log4j依赖

  1. <!-- https://mvnrepository.com/artifact/log4j/log4j -->
  2. <dependency>
  3. <groupId>log4j</groupId>
  4. <artifactId>log4j</artifactId>
  5. <version>1.2.17</version>
  6. </dependency>

设置DruidConfig

现在需要程序员自己为 DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用 Spring Boot 的自动生成了;我们需要 自己添加 DruidDataSource 组件到容器中,并绑定属性;
就是不用SpringBoot自动默认创建的Datasource,显示指定DruidDatasource

  1. package com.example.springboot2jdbc.config;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import com.alibaba.druid.support.http.StatViewServlet;
  4. import org.apache.catalina.filters.WebdavFixFilter;
  5. import org.springframework.boot.context.properties.ConfigurationProperties;
  6. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  7. import org.springframework.boot.web.servlet.ServletRegistrationBean;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import javax.sql.DataSource;
  11. import java.util.HashMap;
  12. //设置druid的配置
  13. @Configuration
  14. public class DruidConfig {
  15. //把我们自定义的druid数据源加入到容器中,不让springboot自己去创建
  16. @ConfigurationProperties(prefix = "spring.datasource")
  17. @Bean
  18. public DataSource druidDataSource(){
  19. return new DruidDataSource();
  20. }
  21. }

测试DruidDatasource

测试发现换成了druid数据源了

  1. @SpringBootTest
  2. class SpringBoot2jdbcApplicationTests {
  3. @Autowired
  4. DataSource dataSource;//数据源对象,自动装配
  5. @Test
  6. void contextLoads() throws SQLException {
  7. //现在输出的就是:class com.alibaba.druid.pool.DruidDataSource
  8. System.out.println(dataSource.getClass());
  9. //获取数据库链接
  10. Connection connection =dataSource.getConnection();
  11. System.out.println(connection);
  12. DruidDataSource druidDataSource = (DruidDataSource) dataSource;
  13. System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive());
  14. System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize());
  15. //关闭
  16. connection.close();
  17. }
  18. }

配置Druid数据源监控

Druid数据源具有监控的功能,并提供了一个 web 界面方便用户查看,类似安装 路由器 时,人家也提供了一个默认的 web 页面。
所以第一步需要设置 Druid 的后台管理页面,比如 登录账号、密码 等;配置后台管理;

  1. package com.example.springboot2jdbc.config;
  2. import com.alibaba.druid.pool.DruidDataSource;
  3. import com.alibaba.druid.support.http.StatViewServlet;
  4. import org.apache.catalina.filters.WebdavFixFilter;
  5. import org.springframework.boot.context.properties.ConfigurationProperties;
  6. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  7. import org.springframework.boot.web.servlet.ServletRegistrationBean;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import javax.sql.DataSource;
  11. import java.util.HashMap;
  12. //设置druid的配置
  13. @Configuration
  14. public class DruidConfig {
  15. //把我们自定义的druid数据源加入到容器中,不让springboot自己去创建
  16. @ConfigurationProperties(prefix = "spring.datasource")
  17. @Bean
  18. public DataSource druidDataSource(){
  19. return new DruidDataSource();
  20. }
  21. //后台监控功能
  22. //因为springboot内置了servlet容器,所以没哦呦web.xml,就用ServletRegistrationBean相当于web来代替
  23. @Bean
  24. public ServletRegistrationBean statViewServlet(){
  25. ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(),"/druid/*");
  26. //后台需要有人登陆,账号密码配置
  27. HashMap<String,String> initParameters =new HashMap<>();
  28. //增加配置
  29. initParameters.put("loginUsername","admin");//登陆的key是固定的,loginUsername LoginPassword
  30. initParameters.put("loginPassword","123456");
  31. //允许谁可以访问
  32. initParameters.put("allow","");//为空表示所有人都可以访问,写localhost表示只有本地可以访问,也可以指定某个人访问
  33. //禁止谁能访问
  34. initParameters.put("deny","192.168.10.132");
  35. bean.setInitParameters(initParameters);//设置初始化参数
  36. return bean;
  37. }
  38. //过滤的功能
  39. @Bean
  40. public FilterRegistrationBean webStatFilter(){
  41. FilterRegistrationBean bean =new FilterRegistrationBean();
  42. bean.setFilter(new WebdavFixFilter());
  43. //可以过滤哪些请求?
  44. HashMap<String,String> initParameters =new HashMap<>();
  45. //这些东西不进行统计
  46. initParameters.put("exclusions","*.js,*.css,/druid/*");
  47. bean.setInitParameters(initParameters);
  48. return bean;
  49. }
  50. }

查看Druid后台

访问http://localhost:8080/druid/index.html
image.png
image.png
(*) property for user to setup说明数据库还没有连接过,连接一下就有内容了
image.png
image.png