上两篇文章,咱们讲到了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/testspring.datasource.username=rootspring.datasource.password=123456spring.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=28740000spring.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...