Hikari,没错,听着就不像英文,是一句日语,最初是由一个居住在日本的老外开发的一款数据库连接池。
(这单词怎么读呢?hi·ka·'lē。注意最后的ri读成le才会有感觉。)
它,超快,快到连Spring Boot 2都宣布支持了。
代码体积更是少的可怜,130kb。
有多快?
那么它到底有多快?看看Hikari官方给的benchmark数据:
每毫秒可以搞这么多次操作。
为什么这么快?
为什么可以这么快呢?看了下它的源码,大概有如下几点原因:
1、字节码编程(此理由欠充分)。
大概翻了下源码,动不动就会直接修改字节码,比如:
没错,它使用了javassist。
不仅仅使用字节码,而且还会使用汇编级别的native代码。
2、自定义List。
它没用ArrayList。而且自己扩展了一个FastList来使用。
这个FastList省去了一些检查,比如范围检查等。具体可以比对下ArrayList和FastList的源码。
3、其他的一些细节优化。
其他一些细节的优化,无法准确的说是哪些优化,只能去看源码慢慢品味了。
如何使用?
依赖
由于是测试着玩,这里我们就使用快捷的内存数据h2来体验。
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.6.1</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.196</version>
</dependency>
实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class Employee {
private int empNo;
private String ename;
private String job;
private int mgr;
private Date hiredate;
private int sal;
private int comm;
private int deptno;
}
DataSource
public class DataSource {
private static HikariConfig config = new HikariConfig();
private static HikariDataSource ds;
static {
// config = new HikariConfig("datasource.properties");
// Properties props = new Properties();
// props.setProperty("dataSourceClassName", "org.h2.Driver");
// props.setProperty("dataSource.user", "");
// props.setProperty("dataSource.password", "");
// props.put("dataSource.logWriter", new PrintWriter(System.out));
// config = new HikariConfig(props);
config.setJdbcUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=runscript from 'classpath:/db.sql'");
config.setUsername("");
config.setPassword("");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
ds = new HikariDataSource(config);
// ds.setJdbcUrl("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;INIT=runscript from 'classpath:/db.sql'");
// ds.setUsername("");
// ds.setPassword("");
}
private DataSource() {
}
public static Connection getConnection() throws SQLException {
return ds.getConnection();
}
}
Main
public class HikariCPDemo {
public static List<Employee> fetchData() {
final String SQL_QUERY = "select * from emp";
List<Employee> employees = null;
try (Connection con = DataSource.getConnection(); PreparedStatement pst = con.prepareStatement(SQL_QUERY); ResultSet rs = pst.executeQuery();) {
employees = new ArrayList<Employee>();
Employee employee;
while (rs.next()) {
employee = new Employee();
employee.setEmpNo(rs.getInt("empno"));
employee.setEname(rs.getString("ename"));
employee.setJob(rs.getString("job"));
employee.setMgr(rs.getInt("mgr"));
employee.setHiredate(rs.getDate("hiredate"));
employee.setSal(rs.getInt("sal"));
employee.setComm(rs.getInt("comm"));
employee.setDeptno(rs.getInt("deptno"));
employees.add(employee);
}
} catch (SQLException e) {
e.printStackTrace();
}
return employees;
}
public static void main(String[] args) {
fetchData().forEach(System.out::println);
}
}
数据
create table dept(
deptno numeric,
dname varchar(14),
loc varchar(13),
constraint pk_dept primary key (deptno)
);
create table emp(
empno numeric,
ename varchar(10),
job varchar(9),
mgr numeric,
hiredate date,
sal numeric,
comm numeric,
deptno numeric,
constraint pk_emp primary key (empno),
constraint fk_deptno foreign key (deptno) references dept (deptno)
);
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');
insert into emp values(
7839, 'KING', 'PRESIDENT', null,
to_date('17-11-1981','dd-mm-yyyy'),
7698, null, 10
);
insert into emp values(
7698, 'BLAKE', 'MANAGER', 7839,
to_date('1-5-1981','dd-mm-yyyy'),
7782, null, 20
);
insert into emp values(
7782, 'CLARK', 'MANAGER', 7839,
to_date('9-6-1981','dd-mm-yyyy'),
7566, null, 30
);
insert into emp values(
7566, 'JONES', 'MANAGER', 7839,
to_date('2-4-1981','dd-mm-yyyy'),
7839, null, 40
);
commit;
运行结果
Employee(empNo=7839, ename=KING, job=PRESIDENT, mgr=0, hiredate=1981-11-17, sal=7698, comm=0, deptno=10) Employee(empNo=7698, ename=BLAKE, job=MANAGER, mgr=7839, hiredate=1981-05-01, sal=7782, comm=0, deptno=20) Employee(empNo=7782, ename=CLARK, job=MANAGER, mgr=7839, hiredate=1981-06-09, sal=7566, comm=0, deptno=30) Employee(empNo=7566, ename=JONES, job=MANAGER, mgr=7839, hiredate=1981-04-02, sal=7839, comm=0, deptno=40)
示例代码请移步github:https://github.com/importsource/hikari-samples
本文分享自 ImportSource 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!