SpringBoot集成Druid连接池
2019年8月28日 11:53 Java框架技术 0评论

简介

druid是Java中最常用的一种数据库连接池,优势就在于它提供的强大的监控和扩展功能,因为是阿里出品,所以更新维护都比较频繁,相对而言比较稳定。因此编写本文来记录一下SpringBoot集成druid数据库连接池的过程。

POM

首先添加mysql驱动依赖:

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.13</version>
</dependency>

然后需要添加druid的依赖,因为是SpringBoot,所以这里引入如下的druid依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.10</version>
</dependency>

此处需要注意,引入上述依赖之后,就可以将下述Spring-JDBC依赖去掉,否则在后续进行yml配置时会出现冲突,导致无法提示。

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
</dependency>

yml配置

在yml中配置DataSource数据源,配置如下:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://localhost:3306/blog?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
      username: root
      password: 123456
      initial-size: 5 #初始化连接数
      max-active: 20 #最大连接数
      max-wait: 10000 #获取链接最大等待时间
      min-idle: 5 #最小连接数
      filter: #statFilter配置
        stat:
          log-slow-sql: true #记录慢sql
          slow-sql-millis: 200 #慢sql时间,单位毫秒,大于此时间视为慢sql
          merge-sql: true #合并sql
      validation-query: SELECT 'x' #解决mysql小时问题
      time-between-eviction-runs-millis: 60000 #空闲链接检查时间间隔
      min-evictable-idle-time-millis: 300000 #空闲链接最小空闲时间

properties配置

如果你使用的是properties文件进行的配置,那么配置文件如下,

spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/blog?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=10000
spring.datasource.druid.min-idle=5
spring.datasource.druid.validation-query=SELECT 'x'
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.filter.stat.log-slow-sql=true #statFilter配置
spring.datasource.druid.filter.stat.slow-sql-millis=200 #statFilter配置
spring.datasource.druid.filter.stat.merge-sql=true #statFilter配置

PS.对比两种配置文件,yml真的比properties好看多了,层次分明直观,properties就显得有些啰里啰嗦了,因此墙裂建议使用yml。

自定义DruidConfig

在上述的配置中,可以看到有两段配置是关于filter的,这里可以将这两段配置,使用Spring Bean的形式进行配置。
新建config包,在config包中新建DruidConfig类,代码如下:

package com.javafeng.site.config;


import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.google.common.collect.Lists;
import com.javafeng.site.filter.LogFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Configuration
public class DruidConfig {
    //若在配置文件中配置了filter,则此Bean不需要
    //关联yml或properties中的配置
    @ConfigurationProperties(prefix = "spring.druid")
    //指定初始化和销毁时执行的方法
    @Bean(initMethod = "init",destroyMethod = "close")
    public DruidDataSource dataSource() {
        DruidDataSource dataSource=new DruidDataSource();
        dataSource.setProxyFilters(Lists.newArrayList(statFilter()));
        return dataSource;
    }

    @Bean
    //配置druid API的访问路径
    public ServletRegistrationBean servletRegistrationBean(){
        return new ServletRegistrationBean(new StatViewServlet(),"/druid/*");
    }

    //若在配置文件中配置了filter,则此Bean不需要
    @Bean
    public Filter statFilter(){
        StatFilter statFilter = new StatFilter();
        statFilter.setSlowSqlMillis(1);
        statFilter.setLogSlowSql(true);
        statFilter.setMergeSql(true);
        return statFilter;
    }
}

如果你已经在yml或properties配置中配置了filter,上述DruidConfig类是不需要的,当然你要是需要查看Druid的API,可以只留下servletRegistrationBean。

我在配置过程中,使用了DruidConfig进行了配置,出现了一个错误:自定义的statFilter和SpringBoot自动配置的statFilter冲突:

貌似是因为配置完yml之后,Spring会根据yml的配置自动注册statFilter这个Bean,再自定义之后就冲突了,此时建议将所有配置都放到yml或properties中,DruidConfig只留下servletRegistrationBean即可。

当然,也可以通过配置允许重复定义Bean,但是不建议。代码如下:
yml:

  main:
    allow-bean-definition-overriding: true

properties:

spring.main.allow-bean-definition-overriding=true

总结一下这一节就是,filter配置从DruidConfig配置和yml、properties中二选一即可,建议采用yml、properties。

完成和测试

配置完之后,根据你上一步servletRegistrationBean中配置的druid API路径,在浏览器进行访问测试,此处的测试路径是http://localhost:8080/druid,浏览器输入此链接可看到如下效果:

评论
暂无评论。