概述
HikariCP 是一个开源的 JDBC 数据库连接池项目。它一个非常轻量级(大约 130KB)且速度快如闪电的 JDBC 连接池框架,由 Brett Wooldridge 于 2012 年左右开发。
一、简介
有多个基准测试结果可用于将 HikariCP 与其他连接池框架(例如:c3p0、dbcp2、tomcat 和 vibur )的性能进行比较。例如,HikariCP 团队发布了以下基准(原始结果可在此处获取):
该框架之所以如此快,是因为应用了以下技术:
字节码级工程——已经完成了一些极端的字节码级工程(包括汇编级本机编码)
微观优化——虽然几乎无法衡量,但这些优化结合起来提高了整体性能
智能使用集合框架——ArrayList被替换为自定义类FastList,该类消除了范围检查并从头到尾执行删除扫描处获取):
二、集成 SpringBoot 使用
1.添加 Maven 依赖
代码如下(示例):
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.0.1</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
HikariCP 还支持较旧的 JDK 版本,例如 6 和 7。可以分别在此处和此处找到合适的版本。我们还可以在 Central Maven Repository 中查看最新版本。
2.创建数据源
applicayion.yml 配置文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
username: root
password: root
type: com.zaxxer.hikari.HikariDataSource
hikari:
pool-name: FxdDbPool
minimum-idle: 10
idle-timeout: 600000
maximum-pool-size: 300
auto-commit: true
max-lifetime: 1800000
connection-timeout: 180000
配置类 DataSourceConfig.java 创建 HikariCP 的 DataSource 实例:
package com.demo.config;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource(DataSourceProperties properties) {
HikariConfig config = new HikariConfig();
config.setUsername(properties.getUsername());
config.setPassword(properties.getUsername());
config.setJdbcUrl(properties.getUrl());
config.setDriverClassName(properties.getDriverClassName());
return new HikariDataSource(config);
}
}
HikariConfig是用于初始化数据源的配置类。它附带了四个众所周知的必须使用的参数:username、password、jdbcUrl 和 driverClassName。
除了这些属性之外,我们可能找不到其他池化框架提供的其他几个可用属性:
- autoCommit
- connectionTimeout
- idleTimeout
- maxLifetime
- connectionTestQuery
- connectionInitSql
- validationTimeout
- maximumPoolSize
- poolName
- allowPoolSuspension
- readOnly
- transactionIsolation
- leakDetectionThreshold
HikariCP 因其这些数据库特性而脱颖而出。它甚至足够先进,可以自行检测连接泄漏。
可以在此处找到上述属性的详细说明。
3.使用数据源
现在我们已经定义了数据源,我们可以使用它从配置的连接池中获取连接,并执行 JDBC 相关操作。
假设我们有个部门表,名为 dept ,来模拟员工用例。我们将编写一个类来使用 HikariCP 从数据库中获取这些详细信息。
下面我们将列出创建示例数据所需的 SQL 语句:
create table dept(
dept_no numeric,
dept_name varchar(14),
loc varchar(13),
constraint pk_dept primary key (dept_no)
);
insert into dept values( 10, 'ACCOUNTING', 'NEW YORK');
insert into dept values( 20, 'RESEARCH', 'DALLAS');
insert into dept values( 30, 'SALES', 'CHICAGO' );
insert into dept values( 40, 'OPERATIONS', 'BOSTON');
数据表对应实体类 Dept.java:
package com.demo.model;
import lombok.Data;
@Data
public class Dept {
private Integer deptNo;
private String deptName;
private String loc;
}
我们需要一个服务类,创建方法来从数据库中获取这些数据:
服务接口 DeptService.java:
import com.halcyon.model.Dept;
import java.sql.SQLException;
import java.util.List;
public interface DeptService {
List<Dept> list() throws SQLException;
}
服务实现类:DeptServiceImpl.java
package com.demo.service.impl;
import com.demo.model.Dept;
import com.demo.service.DeptService;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@AllArgsConstructor
@Service
public class DeptServiceImpl implements DeptService {
private final DataSource dataSource;
public List<Dept> list() throws SQLException {
final String SQL_QUERY = "select * from dept";
List<Dept> departments = new ArrayList<>();
try (Connection connection = dataSource.getConnection();
PreparedStatement pst = connection.prepareStatement(SQL_QUERY);
ResultSet rs = pst.executeQuery()) {
while (rs.next()) {
Dept dept = new Dept();
dept.setDeptNo(rs.getInt("dept_no"));
dept.setDeptName(rs.getString("dept_name"));
dept.setLoc(rs.getString("loc"));
departments.add(dept);
}
}
return departments;
}
}
创建一个 JUnit 方法来测试它。由于我们知道表 dept 中的行数,因此我们可以预期返回列表的大小应等于行数:
package com.demo.service;
import com.demo.model.Dept;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.sql.SQLException;
import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals;
@SpringBootTest
public class DeptServiceTest {
@Autowired
private DeptService deptService;
@Test
public void list_dept_test() throws SQLException {
List<Dept> employees = deptService.list();
assertEquals(4, employees.size());
}
}
总结
在这篇简短的文章中,我们了解了使用 HikariCP 的好处、配置及其整合 SpringBoot 的使用方式。
测试源码:https://gitee.com/ora11g/hikari-cp-demo.git