关于spring:Spring系列之HikariCP连接池

103次阅读

共计 3049 个字符,预计需要花费 8 分钟才能阅读完成。

上两篇文章,咱们讲到了 Spring 中如何配置单数据源和多数据源,配置数据源的时候,连接池有很多抉择,在 SpringBoot 1.0 中应用的是 Tomcat 的 DataSource,在 SpringBoot 2.0 中,咱们应用默认连接池是 HikariCP,本文讲一下 HikariCP。

为什么 SpringBoot 2.0 要抉择 HikariCP 来作为默认的连接池呢?

咱们先看一下官网的一张比照图。

一个连贯周期定义为单个 DataSource.getConnection()/ Connection.close()。一个语句周期定义为单个 Connection.prepareStatement(), Statement.execute(), Statement.close()
从上图看出,HikariCP 和常见的连接池相比,劣势非常明显。

为什么 HikariCP 那么快呢?依据官网概要总结了以下几点

  • 字节码精简:字节码级别优化(很多⽅法通过 JavaAssist ⽣成),直到编译后的字节码起码,这样,CPU 缓存能够加载更多的程序代码;
  • 优化代理和拦截器:缩小代码,例如 HikariCP 的 Statement proxy 只有 100 行代码,只有 BoneCP 的十分之一;
  • 自定义数组类型:(FastStatementList)代替 ArrayList:防止每次 get() 调用都要进行 range check,防止调用 remove() 时的从头到尾的扫描;
  • 自定义汇合类型(ConcurrentBag:进步并发读写的效率;
  • 代理类的优化(⽐如,⽤ invokestatic 代替了 invokevirtual)
  • 其余针对 BoneCP 缺点的优化,比方对于耗时超过一个 CPU 工夫片的办法调用的钻研(但没说具体怎么优化)。

既然 HikariCP 那么快,接下来就看一下在 Spring 中怎么应用 HikariCP?

在 Spring Boot 2.x 中
• 默认使⽤ HikariCP
• 配置 spring.datasource.hikari.* 配置

在 Spring Boot 1.x 中
• 默认使⽤ Tomcat 连接池,须要移除 tomcat-jdbc 依赖
• 在 application.properties 文件中加上 spring.datasource.type=com.zaxxer.hikari.HikariDataSource

咱们来看一下 SpringBoot2.0 怎么应用配置 HikariDataSource 的

上面是 org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration 中的相干代码


/**
* 上面的三个注解意思是当 classpath 中有 HikariDataSource.class,并且 Spring 上下文中没有配置 DataSource 的 bean
* 并且 spring.datasource.type 的值是 com.zaxxer.hikari.HikariDataSource 的时候,SpringBoot 主动帮咱们抉择默认的连接池是 HikariDataSource
*/
@ConditionalOnClass({HikariDataSource.class})
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(name = {"spring.datasource.type"},havingValue = "com.zaxxer.hikari.HikariDataSource",matchIfMissing = true)
static class Hikari {Hikari() {
}

@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
HikariDataSource dataSource(DataSourceProperties properties) {HikariDataSource dataSource = (HikariDataSource)DataSourceConfiguration.createDataSource(properties, HikariDataSource.class);
            if (StringUtils.hasText(properties.getName())) {dataSource.setPoolName(properties.getName());
            }
            return dataSource;
        }
}

最初看看,HikariCp 配置的参数有哪些?

# 不同数据源这四个配置都会用到
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

#以下的配置项是 hikari 特有的配置
# 期待连接池调配连贯的最大时长(毫秒),超过这个时长还没可用的连贯则产生 SQLException,默认:30 秒
spring.datasource.hikari.connection-timeout=30000
# 最小连接数
spring.datasource.hikari.minimum-idle=5
# 最大连接数
spring.datasource.hikari.maximum-pool-size=15
# 主动提交
spring.datasource.hikari.auto-commit=true
# 一个连贯 idle 状态的最大时长(毫秒),超时则被开释(retired),默认:10 分钟
spring.datasource.hikari.idle-timeout=600000
# 连接池名字
spring.datasource.hikari.pool-name=DatebookHikariCP
# 一个连贯的生命时长(毫秒),超时而且没被应用则被开释(retired),默认:30 分钟 1800000ms,倡议设置比数据库超时时长少 60 秒
spring.datasource.hikari.max-lifetime=28740000
spring.datasource.hikari.connection-test-query=SELECT 1

#以下是针对 MYSQL 驱动的配置参数
# 在每个连贯中缓存的语句的数量。默认值为激进值 25。倡议将其设置为 250-500 之间
spring.datasource.hikari.prepStmtCacheSize = 300
# 缓存的已筹备 SQL 语句的最大长度,默认值是 256,然而往往这个长度不够用
spring.datasource.hikari.prepStmtCacheSqlLimit = 2048
# 缓存开关,如果这里设置为 false,下面两个参数都不失效
spring.datasource.hikari.cachePrepStmts = true
#较新版本的 MySQL 反对服务器端筹备好的语句,这能够提供实质性的性能晋升
spring.datasource.hikari.useServerPrepStmts = true

HikariCP 官网地址:https://github.com/brettwoold…

正文完
 0