赞
踩
HikariCP 是一个开源的 JDBC 数据库连接池项目。它一个非常轻量级(大约 130KB)且速度快如闪电的 JDBC 连接池框架,由 Brett Wooldridge 于 2012 年左右开发。
有多个基准测试结果可用于将 HikariCP 与其他连接池框架(例如:c3p0、dbcp2、tomcat 和 vibur )的性能进行比较。例如,HikariCP 团队发布了以下基准(原始结果可在此处获取):
该框架之所以如此快,是因为应用了以下技术:
字节码级工程——已经完成了一些极端的字节码级工程(包括汇编级本机编码)
微观优化——虽然几乎无法衡量,但这些优化结合起来提高了整体性能
智能使用集合框架——ArrayList被替换为自定义类FastList,该类消除了范围检查并从头到尾执行删除扫描处获取):
代码如下(示例):
<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 中查看最新版本。
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。
除了这些属性之外,我们可能找不到其他池化框架提供的其他几个可用属性:
可以在此处找到上述属性的详细说明。
现在我们已经定义了数据源,我们可以使用它从配置的连接池中获取连接,并执行 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。