前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >初体验Spring Boot 2支持的HikariCP连接池

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

作者头像
ImportSource
发布2018-04-03 11:41:18
2.4K0
发布2018-04-03 11:41:18
举报
文章被收录于专栏:ImportSource

Hikari,没错,听着就不像英文,是一句日语,最初是由一个居住在日本的老外开发的一款数据库连接池。

(这单词怎么读呢?hi·ka·'lē。注意最后的ri读成le才会有感觉。)

它,超快,快到连Spring Boot 2都宣布支持了。

代码体积更是少的可怜,130kb。

有多快?

那么它到底有多快?看看Hikari官方给的benchmark数据:

每毫秒可以搞这么多次操作。

为什么这么快?

为什么可以这么快呢?看了下它的源码,大概有如下几点原因:

1、字节码编程(此理由欠充分)。

大概翻了下源码,动不动就会直接修改字节码,比如:

没错,它使用了javassist。

不仅仅使用字节码,而且还会使用汇编级别的native代码。

2、自定义List。

它没用ArrayList。而且自己扩展了一个FastList来使用。

这个FastList省去了一些检查,比如范围检查等。具体可以比对下ArrayList和FastList的源码。

3、其他的一些细节优化。

其他一些细节的优化,无法准确的说是哪些优化,只能去看源码慢慢品味了。

如何使用?

依赖

由于是测试着玩,这里我们就使用快捷的内存数据h2来体验。

代码语言:javascript
复制
<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>

实体类

代码语言:javascript
复制
@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 {

代码语言:javascript
复制
    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 {

代码语言:javascript
复制
    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(

代码语言:javascript
复制
  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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ImportSource 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档