1、引入依赖
<!--<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>${druid.version}</version>
        </dependency>-->

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${druid.version}</version>
        </dependency>

 

2、application.yml
spring:
  datasource:
    #数据源基本配置
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/tmall?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: ok

    #数据源其他配置
    #初始化大小、最小、最大。数据库连接池的连接数,一般为(核心数*2+有效磁盘数),减少线程上下文切换开销
    initialSize: 5 #初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
    minIdle: 5
    maxActive: 20

    #配置获取(指的是druid连接池的连接)连接等待超时的时间
    #获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁
    maxWait: 60000
    #配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒。也是testWhileIdle的判断依据
    timeBetweenEvictionRunsMillis: 60000
    #配置一个连接在池中最小生存时间。Destory线程中如果检测到当前连接的最后活跃时间和当前时间的差值大于minEvictableIdleTimeMillis,则关闭当前连接
    minEvictableIdleTimeMillis: 300000

    #验证连接的sql
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true #建议配置为true,不影响性能,并且保证安全性,如果空闲时间大于timeBetweenEvictionRunsMillis,就执行validationQuery
    #检测池里连接的可用性,但很消耗性能
    testOnBorrow: false #申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
    testOnReturn: false #归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能

    #打开 PSCache,并且指定每个连接上 PSCache 的大小
    #druid的连接池配置中有PreparedStatementCache的配置,该信息解决了sql语句可以被预编译,并且保存在PreparedStatement这个对象中,
    #而这个对象的存储就在PreparedStatementCache,对于oracle可以绕过数据库编译,有很大的提升,但是对于mysql,没有那么明显。
    #这个值的设置不是越大越好,PSCache会占用jvm,占用量=连接数*PSCache设置的大小*每个PSCache占用的内存
    #是否缓存preparedStatement,也就是PSCache。#PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql5.5以下的版本中没有PSCache功能,建议关闭掉。5.5及以上版本有PSCache,建议开启
    poolPreparedStatements: true
    #在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100
    maxPoolPreparedStatementPerConnectionSize: 20

    #属性类型是字符串,通过别名的方式配置扩展插件,
    #常用的插件有:
    #监控统计用的filter:stat
    #日志用的filter:log4j
    # 防御sql注入的filter:wall
    filters: stat,wall
    useGlobalDataSourceStat: true
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

    #是否自动回收超时连接
    removeAbandoned : true
    #超时时间,秒
    removeAbandonedTimeout : 180
    #指定发生removeabandoned的时候,是否记录当前线程的堆栈信息到日志中
    logAbandoned: true

 

3、DataSourceConfig
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
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.sql.DataSource;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DataSourceConfig {

    /**
     * 虽然我们配置了druid连接池的其它属性,但是不会生效。因为默认是使用的java.sql.Datasource的类来获取属性的,
     * 有些属性datasource没有。如果我们想让配置生效,需要手动创建Druid的配置文件
     */
    @Bean
    @ConfigurationProperties("spring.datasource")
    public DataSource dataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        //请求失败后是否中断
        dataSource.setBreakAfterAcquireFailure(true);
        //重试次数
        dataSource.setConnectionErrorRetryAttempts(0);

        return dataSource;
    }

    /**
     * Druid的最强大之处在于它有着强大的监控,可以监控我们发送到数据库的所有sql语句。方便我们后期排插错误
     * 配置Druid的监控
     * 配置一个管理后台的Servlet
     * http://localhost:8080/druid/login.html
     */
    @Bean
    public ServletRegistrationBean statViewServlet() {
        ServletRegistrationBean registrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*");

        Map<String, String> initParams = new HashMap<>();
        //登录名
        initParams.put("loginUsername","admin");
        //登录密码
        initParams.put("loginPassword","admin");
        //默认就是允许所有访问
        initParams.put("allow","");
        //拒接访问
        //initParams.put("deny","127.0.0.1");
        registrationBean.setInitParameters(initParams);
        return registrationBean;
    }

    /**
     * 配置一个web监控的filter
     */
    @Bean
    public FilterRegistrationBean webStatFilter(){
        FilterRegistrationBean bean = new FilterRegistrationBean();
        bean.setFilter(new WebStatFilter());

        Map<String,String> initParams = new HashMap<>();
        initParams.put("exclusions","*.js,*.css,/druid/*");

        bean.setInitParameters(initParams);

        bean.setUrlPatterns(Arrays.asList("/*"));

        return  bean;
    }

}