SpringBoot(五) HikariCP 数据库连接池

Spring Boot 2默认数据库连接池选择了HikariCP

为何选择HikariCP

HiKariCP是数据库连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他连接池,是一个高性能的JDBC连接池,基于BoneCP做了不少的改进和优化。其作者还有另外一个开源作品——高性能的JSON解析器HikariJSON。

它,超快,快到连Spring Boot 2都宣布支持了。

HikariCP
HikariJSON

HikariCP所做的一些优化

官网详细地说明了HikariCP所做的一些优化,总结如下:

  • 字节码精简 :优化代码,直到编译后的字节码最少,这样,CPU缓存可以加载更多的程序代码
  • 优化代理和拦截器:减少代码,例如HikariCP的Statement proxy只有100行代码,只有BoneCP的十分之一
  • 自定义数组类型(FastStatementList)代替ArrayList:避免每次get()调用都要进行range check,避免调用remove()时的从头到尾的扫描
  • 自定义集合类型(ConcurrentBag:提高并发读写的效率
  • 其他针对BoneCP缺陷的优化,比如对于耗时超过一个CPU时间片的方法调用的研究

HikariCP与Druid相比哪个更好?

不评论,一个追求性能,一个偏向监控。

快速入门

说得这么好,用起来会不会很麻烦啊,会不会有很多参数要配置才能有这样的效果啊?答案是:不会

springboot 2.0 默认连接池就是Hikari 了,所以引用parents后不用专门加依赖。

版本对应

Java 8/9 maven artifact:

1
2
3
4
5
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.1.0</version>
</dependency>

Java 7 maven artifact (maintenance mode):

1
2
3
4
5
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java7</artifactId>
<version>2.4.13</version>
</dependency>

Java 6 maven artifact (maintenance mode):

1
2
3
4
5
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP-java6</artifactId>
<version>2.3.13</version>
</dependency>

添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!--HikariCP 3-->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>3.1.0</version>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

配置文件

修改 appliction.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
spring:
datasource:
# jdbc_config
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
username: root
password: root
# Hikari
type: com.zaxxer.hikari.HikariDataSource
hikari:
# 空闲连接的最小数量
minimum-idle: 5
# 连接池最大连接数
maximum-pool-size: 15
# 自动提交
auto-commit: true
# 连接idle状态的最大时长(毫秒)
idle-timeout: 30000
# 连接池名称(可改)
pool-name: springHikariCP
# 连接的生命时长(毫秒)
max-lifetime: 1800000
# 等待连接池分配连接的最大时长(毫秒)
connection-timeout: 30000
# 用来检测连接是否有效
connection-test-query: SELECT 1
# 是否是只读数据源, 做读写分离时有用, 保证slave数据源的安全
read-only: false

# 配置JPA
jpa:
properties:
hibernate:
show_sql: true
format_sql: true

效果

-------------- 本文结束  感谢您的阅读 --------------