Fork me on GitHub

SpringBoot那些好用的连接池HikariCP

目录

HikariCP来自于日语,翻译过来是光的意思,由此可见,连接池非常的快。

HikariCP是什么

HikariCP是数据库连接池,而且是号称史上最快的,而且目前来看确实是这样的,SpringBoot2.0也已经采用HikariCP作为默认连接池配置.

1571219068394

HikariCP GitHub网址

HikariCP为什么这么快

  • 字节码级别优化(很多方法通过JavaAssist生成)

    代码量非常小,很多方法都没有写,是通过JavaAssist编译的时候是动态生成的。

  • 大量小改进

    • 用FastStatementList代替ArrayList

    • 无锁集合ConcurrentBag(借鉴了.NET中的ConcurrentBag,在java中实现了自己的ConcurrentBag,对于高并发方面有些优化)

    • 代理类的优化 (比如,用invokestatic代替了invokevirtual)

      [invokestatic通过调用getProxyPreparedStatement静态方法生成了18个操作

      invokevirtual通过ProxyFactory.getProxyPreparedStatement生成15个操作,由此可见。

在Spring Boot中的配置

Spring Boot 2.x

  • 默认使用HikariCP
  • 配置spring.datasource.hikari.* 配置

Spring Boot 1.x

  • 默认使用Tomcat连接池,需要移除tomcat-jdbc依赖
  • spring.datasource.type=com.zaxxer.hikari.HikariDataSource

HikariCP数据源配置源码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

/**
* Hikari DataSource configuration.
*/
@Configuration
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type",
havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true)
static class Hikari {

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

}

相关文章