HikariCP连接池介绍

一、 性能上的提升

HikariCP是现在比较快,而且轻量的连接池,相比于其他连接池,性能上都有一定的提升,以下是它和一些其他连接池的性能的比较:
HikariCP连接池介绍

关于HikariCP连接池速度快于其他连接池的原因,主要有一下几个方面:
1.相比于普通连接池,在ConnectionProxy中使用ArrayList来存储Statement对象,HikariCP改用FatList来存储对象,而其中的区别是,ArrayList在每次执行get(Index)方法时,都需要对List的范围进行检查,而FastList不需要,在能确保范围的合法性的情况下,可以省去范围检查的开销。
2.另外在Java代码中,很多关于Connection的操作,都是在使用完之后直接关闭连接,以前都是从头到尾遍历,来关闭对应的Connection,而HikariCP则是从尾部对Connection集合进行扫描,整体上来说,从尾部开始的性能更好一些。
3.内部使用一个无锁的集合来存储,并对其中的切换操作做了优化。
4.从字节码指令的角度去优化,连接池使用
PROXY_FACTORY.getProxyPreparedStatement(this, delegate.prepareStatement(sql, columnNames))语句来建立statements,resultset等的实例,将其翻译成字节码指令后,会有如下的指令,0: getstatic和15: invokevirtual #69。将上述的方法改为使用 ProxyFactory.getProxyPreparedStatement(this, delegate.prepareStatement(sql, columnNames)),后,就不在需要0: getstatic指令,并且使用了12: invokestatic #67代替了15: invokevirtual #69,前者invokestatic 更容易被JIT优化。另外从堆栈的角度来说,堆栈大小也从原来的5变成了4。

二、简单使用

**//直接初始化HikariConfig**
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");
config.setUsername("bart");
config.setPassword("51mp50n");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
HikariDataSource ds = new HikariDataSource(config);

//直接初始化HikariDataSource
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl("jdbc:mysql://localhost:3306/simpsons");
ds.setUsername("bart");
ds.setPassword("51mp50n");

//通过文件配置参数
HikariConfig config = new HikariConfig("/some/path/hikari.properties");
HikariDataSource ds = new HikariDataSource(config);
//文件配置例子
dataSourceClassName=org.postgresql.ds.PGSimpleDataSource
dataSource.user=test
dataSource.password=test
dataSource.databaseName=mydb
dataSource.portNumber=5432
dataSource.serverName=localhost

//使用Properties配置
Properties props = new Properties();
props.setProperty("dataSourceClassName", "org.postgresql.ds.PGSimpleDataSource");
props.setProperty("dataSource.user", "test");
props.setProperty("dataSource.password", "test");
props.setProperty("dataSource.databaseName", "mydb");
props.put("dataSource.logWriter", new PrintWriter(System.out));
HikariConfig config = new HikariConfig(props);
HikariDataSource ds = new HikariDataSource(config);