0x01 使用方法
配置依赖:
<!-- java 8 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.6.2</version>
</dependency>
项目没用使用spring等一系列高大上的轮子,在接入连接池的时候无法去配置datasource,所以使用的是比较简单粗暴的方式,手动创建HikariConfig,使用该对象去创建datasource。
private HikariDataSource initDataSource(String url, int jdbcPoolSize) {
HikariConfig config = new HikariConfig();
config.setDriverClassName("com.mysql.cj.jdbc.Driver");
config.setJdbcUrl(url);
config.setAutoCommit(false);
config.setConnectionTestQuery("SELECT 1;");
config.setMaximumPoolSize(jdbcPoolSize);
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
config.setMaxLifetime(MAX_LIFE_TIME);
config.setIdleTimeout(IDLE_TIMEOUT);
return new HikariDataSource(config);
}
接下来就可以使用datasource来得到connection。连接池内的连接用完要释放掉,推荐try-with-resources。
0x02 hikari注意点
- 需要服务器同NTP服务器保持同步(https://dba.stackexchange.com/questions/171002/choice-of-connection-pooling-library-for-vm-deploys/171020)。
- hikari不支持连接池层的preparestatement缓存,推荐使用jdbc驱动的preparestatement缓存。
- hikari也不支持Log Statement Text/Slow Query Logging,因为大多数的驱动都支持了。
0x03 hikari参数详解
- allowPoolSuspension:连接池是否可以被jmx挂起,如果连接池被挂起,getConnection就不会超时,默认值false。
- autoCommit:connection是否自动提交,默认值true。
- catalog:配置连接的数据库。
- connectionInitSql:创建连接前默认执行的sql语句,如果语句执行失败连接则失败,然后重试连接,默认值无。
- connectionTestQuery:jdbc4以下版本的驱动可以设置这个参数,用来支持jdbc4新提供的api,Connection.isValid(),默认值无。
- connectionTimeout:从池中获取连接的最大等待时间,超时抛异常,默认值30s。
- dataSource:对一些Ioc框架有用,如果设置其他的datasource参数将被忽略,默认值无。
- dataSourceClassName:设置datasource jdbc驱动提供的类名,如果基于jdbc url的jdbc驱动则不须要设置,默认值无。
- dataSourceJNDI:默认值无。
- dataSourceProperties:datasource的properties。
- driverClassName:基于jdbc url的jdbc驱动类。
- healthCheckRegistry:Ioc框架在用,检测当前数据连接池的健康状态。
- idleTimeout:连接在池中闲置超过这个时间,则删除。0表示空闲连接不删除,默认值10分钟。
- initializationFailFast:是否开启failfast,默认值true。
- initializationFailTimeout:连接池初始连接的timeout值,单位毫秒。如果在timeout的期间内无法初始化成功连接池,则抛出异常。如果设置为0,会尝试重连,重连失败则抛异常终止连接池,小于0表示不重连,默认值1。
- isolateInternalQueries:是否将连接池的查询封装在自己的事务中,这个属性在autoCommit=false时生效,默认false。
- jdbc4ConnectionTest:jdbc4驱动的test sql。
- jdbcUrl:jdbc url。
- leakDetectionThreshold:内存泄漏侦测入口,默认值0。
- maxLifetime:连接最大存活时间。
- maximumPoolSize:最大的缓冲池大小。
- metricRegistry:Ioc框架在用,统计当前数据连接池的状态。
- minimumIdle:最小空闲的连接数。
- password:密码。
- poolName:连接池名,给JMX用,默认值自动生成。
- readOnly:连接是否只读,默认值false。
- registerMbeans:是否注册管理构建工具,默认值false。
- transactionIsolation:事务的隔离级别,默认驱动默认值。
- username:用户名。
- validationTimeout:连接活动的超时时间,必须比connectionTimeout小,默认250ms。
0x04 DataSource和DriverManager的对比
jdbc2.0开始使用了DataSource接口来创建连接。对比直接DriverManager的方式创建连接,DataSource会更优雅一些。可以自己实现DataSource封装创建连接的过程,也可以将DriverManager封装成DataSource创建连接。而DriverManager需要显示的将驱动类名硬编码在代码中。DataSource的方案会更面向连接池
0x05 hikari推荐配置
jdbcUrl=jdbc:mysql://localhost:3306/simpsons
user=test
password=test
dataSource.cachePrepStmts=true
dataSource.prepStmtCacheSize=250
dataSource.prepStmtCacheSqlLimit=2048
dataSource.useServerPrepStmts=true
dataSource.useLocalSessionState=true
dataSource.useLocalTransactionState=true
dataSource.rewriteBatchedStatements=true
dataSource.cacheResultSetMetadata=true
dataSource.cacheServerConfiguration=true
dataSource.elideSetAutoCommits=true
dataSource.maintainTimeStats=false