SpringBoot:集成Druid

 

Druid简介

为了提高性能操作数据库,需要使用数据库连接池。

Druid是阿里巴巴开源平台上一个数据库连接池的实现,结合了C3P0,DBCP等DB池的优点,同时加入了日志监控。

Druid可以很好的监控DB连接池和SQL的执行情况,天生就是针对监控而生的DB连接池。

SpringBoot2.0以上默认使用Hiakri数据源,可以说Hikari与Druid都是当前JavaWeb上最优秀的数据源。

我们将来学习SpringBoot如何集成Druid数据源,如何实现数据库监控。

配置数据源

环境前提:添加了web和jdbc以及mysql的依赖

<dependencies>
        <!--jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
         <!--web-->   
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <!--lambok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>


    </dependencies>

 

  • 添加Druid依赖
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.21</version>
</dependency>
  • 切换数据源,我的配置文件是yaml格式
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=GMT%2B8&userUnicode=true&characterEncoding=utf-8
    username: root
    password: password
    #SpringBoot2.0以上默认HikariDataSource数据源
    type: com.alibaba.druid.pool.DruidDataSource
  • 测试数据源是否成功切换
@SpringBootTest
class SpringBootDataApplicationTests {
    @Autowired
    DataSource dataSource;
    @Test
    void contextLoads() throws SQLException {
        Connection connection = dataSource.getConnection();
        //查看数据源
        System.out.println(connection.getClass());
    }

}

结果:

class com.alibaba.druid.pool.DruidPooledConnection
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/eesy_mybatis?serverTimezone=GMT%2B8&userUnicode=true&characterEncoding=utf-8
    username: root
    password: password
    #SpringBoot2.0以上默认HikariDataSource数据源
    type: com.alibaba.druid.pool.DruidDataSource
    #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的依赖
<dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
  • 不再使用SpringBoot自动配置,自己添加DruidDataSource组件到容器中,为DuridDataSource绑定全局配置文件中的参数,再添加到容器中。

配置思路:

  1. 将自己配置的duirdDataSource加上@Bean注解添加到IOC容器中
  2. 将配置文件里的属性和DruidConfig绑定
  3.  为DruidConfig添加功能
/**
 * @author Claw
 */
@Configuration
public class DruidConfig {

    /**
     * 1.将自己配置的duirdDataSource加上@Bean注解添加到IOC容器中
     * 2.将配置文件里的属性和DruidConfig绑定
     * 3.为DruidConfig添加功能
     */
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource druiddDataSource(){
        return new DruidDataSource();
    }

    /**
     * 后台监控功能,代码是固定的.
     * 这相当于在web.xml注册servlet.
     * SpringBoot内置了Servlet容器,所以没有web.xml,ServletRegistrationBean是替代注册Servlet的一种方式.
     * @return
     */
    @Bean
    public ServletRegistrationBean statViewServlet(){

        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        HashMap<String,String> initParemeters = new HashMap<>();
        //增加配置 用户名和用户密码, key固定的为loginUsername和loginPassword
        initParemeters.put("loginUsername","admin");
        initParemeters.put("loginPassword","12345");
        //设置初始化参数
        bean.setInitParameters(initParemeters);
        return bean;
    }
}

 

  • 进行测试

在浏览器输入localhost:8080/druid 会进入后台监控页面,输入自己定义好的loginUsername和loginPassword

springboot中用DataSource手动配置数据源 springboot数据源druid_spring

进入后台页面就能在首页看到druid的版本,驱动,jdk版本,和类加载器里的东西。也能看见红框标注的地方有很多功能。

springboot中用DataSource手动配置数据源 springboot数据源druid_bc_02

 编写一个Controller,使用JdbcTemplate来进行一个简单的查询。

/**
 * @author Claw
 */
@RestController
public class JdbcController {
    @Autowired
    JdbcTemplate jdbcTemplate;

    @RequestMapping("/findAll")
    public List<Map<String, Object>> findTest() {
        String sql = "select * from user";
        jdbcTemplate.queryForList(sql);
        return jdbcTemplate.queryForList(sql);
    }

}

在Druid的后台监控页面的SQL监控模块就能看见监控数据了。

springboot中用DataSource手动配置数据源 springboot数据源druid_bc_03

配置Druid Web监控 filter 

/**
     * 注册Filter
     * FilterRegistrationBean也是替代注册filter的一种方式
     * @return
     */
    @Bean
    public FilterRegistrationBean webStatFilter(){

        FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new WebStatFilter());

        //exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
        Map<String,String> initParameters = new HashMap<>();
        initParameters.put("exclusions","*.js,*.css,/durid/*");

        // /*表示过滤所有请求
        bean.setUrlPatterns(Arrays.asList("/*"));

        return bean;
    }

参考:狂神说SpringBoot08:整合Druid