初体验Spring Boot 2支持的HikariCP连接池

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(importsource)

原文发表时间:2018-03-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

MongoDB - basic

mongoDB basic from:http://www.tutorialspoint.com/mongodb prject:https://github....

33660
来自专栏Jerry的SAP技术分享

使用Excel调用ABAP系统的函数

效果:在excel里创建一个按钮,开发一些VB script,可以连接指定的ABAP系统并执行系统里的ABAP function module。

36570
来自专栏大数据学习笔记

Ansible playbook简单示例

1、 YAML基本语法 YAML使用的Unicode字符。 使用空白字符未文件缩排来表示结构;不过不能使用跳格字符。 注解由#开始,可以出现在一行中的任何位置,...

34260
来自专栏狂码一生

用MFC写一个聊天室程序 - 学习笔记

下面的服务器端与客户端的程序与步骤是我在学习MFC网络编程写一个聊天室程序所写的程序,在这里作一个笔记,也希望能帮到一部分刚刚学习的朋友,一起共勉,一起努力历进...

1.1K150
来自专栏岑玉海

sqoop 从sqlserver2008 导入数据到hadoop

  今天终于开始上手导入数据到hadoop了,哈哈,过程蛮崎岖的,和官方文档的还不太一样。   OK,let's go!试验对象是我第一个名为ST_Statis...

43450
来自专栏企鹅号快讯

Java文件上传管理器 控制台

上传文件下载管理器项目技术 JDBC + IO + Socket 实现功能 客户端注册:通过输入用户名,密码,确认密码并且校验完成以后将用户信息储存在数据库中。...

31160
来自专栏Java 源码分析

SpringBoot 笔记(十一):Servlet容器

27720
来自专栏GIS讲堂

Arcgis4js实现链家找房的效果

买房的各位亲们不知是否留意过链家的"地图找房",这样的功能对于使用者来说,是非常方便的,大家可通过连接(https://bj.lianjia.com/ditu/...

13520
来自专栏闻道于事

JavaWeb(四)JDBC操作Oracle

JDBC:Java DataBase Connectivity(java数据库连接) SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范...

50440
来自专栏闻道于事

商城项目整理(四)JDBC+富文本编辑器实现商品增加,样式设置,和修改

UEditor富文本编辑器:http://ueditor.baidu.com/website/ 相应页面展示: 商品添加: ? 商品修改: ? 前台商品展示...

69740

扫码关注云+社区

领取腾讯云代金券