暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Spring Boot整合Druid数据库连接池

波波的小书房 2021-08-10
1791
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;
    }
 
}

复制




文章转载自波波的小书房,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论