当前位置: 首页 > article >正文

spring-boot下Hikari、Druid的使用

文章目录

      • 一.引言
      • 二.Hikari
      • 三.Druid
      • 四.连接池参数

一.引言

数据库连接池负责分配、管理、释放数据库连接,它允许应用程序重复使用现有的数据连接,而不是重新创建一个。释放超过最大空间时间的数据库连接来避免因为没有释放数据库连接导致数据库连接泄漏。本文主要介绍Hikari和Druid两种数据库连接池的使用。

Hikari速度极快;但是Druid功能更加全面,支持sql级监控,扩展、SQL防注入,而且有更多、更久的生产实践、更可靠。

二.Hikari

  • maven依赖

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    
  • 配置方式

    spring:
      datasource:
        type: com.zaxxer.hikari.HikariDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/blog-data?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
        username: root
        password: 123456
        hikari:
          minimum-idle: 5
    
  • HikariDataSource注入过程

    • spring-boot-autoconfigure依赖下的META-INFO/spring-factories

      org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,
      
    • DataSourceAutoConfiguration

      @Configuration(proxyBeanMethods = false)
      	@Conditional(PooledDataSourceCondition.class)
      	@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
      	// 导入Hikari
      	@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
      			DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class,
      			DataSourceJmxConfiguration.class })
      	protected static class PooledDataSourceConfiguration {
      
      	}
      
    • DataSourceConfiguration.Hikari

      @Configuration(proxyBeanMethods = false)
      //有class文件的时候执行
      	@ConditionalOnClass(HikariDataSource.class)
      //没有实例的时候执行
      	@ConditionalOnMissingBean(DataSource.class)
      //有配置的时候执行
      	@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
      			matchIfMissing = true)
      	static class Hikari {
      
      		//注入dataSource bean
      		@Bean
      		//设置HikariDataSource实例的属性
      		@ConfigurationProperties(prefix = "spring.datasource.hikari")
      		HikariDataSource dataSource(DataSourceProperties properties) {
      			HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
      			if (StringUtils.hasText(properties.getName())) {
      				dataSource.setPoolName(properties.getName());
      			}
      			return dataSource;
      		}
      
      	}
      

三.Druid

  • maven依赖

    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.1.10</version>
    </dependency>
    
  • 配置方式

    spring:
      datasource:
        type: com.zaxxer.hikari.HikariDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://localhost:3306/blog-data?zeroDateTimeBehavior=convertToNull&useUnicode=true&characterEncoding=utf-8
        username: root
        password: 123456
        druid:
          minimum-idle: 5
    
  • DruidDataSource注入方式

    • druid-spring-boot-starter下的spring.factory

      com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
      
    • DruidDataSourceAutoConfigure

      //调用DruidDataSource的init方法
      @Bean(
              initMethod = "init"
          )
          @ConditionalOnMissingBean
          public DataSource dataSource() {
              LOGGER.info("Init DruidDataSource");
              return new DruidDataSourceWrapper();
          }
      
    • DruidDataSourceWrapper

      @ConfigurationProperties("spring.datasource.druid")
      class DruidDataSourceWrapper extends DruidDataSource implements InitializingBean {
          @Autowired
          private DataSourceProperties basicProperties;
      
          DruidDataSourceWrapper() {
          }
      
          public void afterPropertiesSet() throws Exception {
              if (super.getUsername() == null) {
                  super.setUsername(this.basicProperties.determineUsername());
              }
      
              if (super.getPassword() == null) {
                  super.setPassword(this.basicProperties.determinePassword());
              }
      
              if (super.getUrl() == null) {
                  super.setUrl(this.basicProperties.determineUrl());
              }
      
              if (super.getDriverClassName() == null) {
                  super.setDriverClassName(this.basicProperties.getDriverClassName());
              }
      
          }
      }
      
    • DruidDataSource.init()进行参数校验

四.连接池参数

配置说明
initialSize初始连接池大小
minIdle最小连接数
maxActive最大连接数
maxWait获取连接最大等待时间
minEvictableIdleTimeMillis连接最小生存时间
maxEvictableIdleTimeMillis连接最大生存时间
timeBetweenEvictionRunsMillis间隔多久进行一次连接检测,检测需要关闭的空闲连接
testWhileIdle从连接池获取连接时,连接空闲时间大于timeBetweenEvictionRunsMillis时检测连接有效性
testOnBorrow获取连接时检测连接有效性
testOnReturn归还连接时检测连接有效性,每次获取和归还连接时都检测太过频繁,建议使用testWhileIdle+ timeBetweenEvictionMills
keepAlive是否定期探活
keepAliveBetweenTimeMillis探活间隔
phyMaxUseCount最大使用次数
validationQuery探活、验证链接有效性的查询
filters监控统计拦截的filter

http://www.kler.cn/a/14641.html

相关文章:

  • 后台优化主要分为哪些?工作内容及流程是什么?
  • 如何从有故障的 SD 卡恢复文件
  • day35—选择题
  • NEFU-2023-算法设计与分析实验二动态规划算法设计
  • Direct3D 12——计算着色器——线程标识的系统值
  • 活动目录域服务
  • 【Java基础】Java总览
  • STM32“死机“(实用调试技巧)
  • 第三章 使用 Maven:命令行环境
  • 2023-04-24 mysql-InnoDB undo log
  • Node实现CSDN博客导出(后续)
  • 【Python】实战:生成无关联单选问卷 csv《跌倒风险评估量表》
  • Vue CLI 环境变量和模式
  • Three——二、加强对三维空间的认识
  • 【学习心得】页面banner布局相关
  • 01 【Sass的安装使用】
  • github 基础
  • 架构师的六大生存法则
  • 龙讯旷腾材料计算大赛启动,打怪升级赢大奖
  • 八股文 -- Java基础和集合框架