0
点赞
收藏
分享

微信扫一扫

【java web篇】MyBatis之Mapper代理

Separes 2023-04-24 阅读 82

文章目录

一.引言

数据库连接池负责分配、管理、释放数据库连接,它允许应用程序重复使用现有的数据连接,而不是重新创建一个。释放超过最大空间时间的数据库连接来避免因为没有释放数据库连接导致数据库连接泄漏。本文主要介绍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注入方式

    • 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
举报

相关推荐

0 条评论