hikari数据库连接池

hikari数据库连接池

Posted by CaiJiahe on August 24, 2017

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

connector/J ppt