maxLifetime参数必须小于数据库的time_wait,默认是1800000,即30分钟。如果设置为0,表示存活时间无限大。如果不等于0且小于30秒则会被重置回30分钟。HikariConfig类中有该参数的校验规则。
HikariPool类中,当我们初始化连接池的时候,它的构造方法中,实例化了this.POOL_ENTRY_CREATOR = new HikariPool.PoolEntryCreator();
该类实现了Callable接口,用来初始化连接。
public Boolean call() throws Exception {
for(long sleepBackoff = 250L; HikariPool.this.poolState == 0 && HikariPool.this.totalConnections.get() < HikariPool.this.config.getMaximumPoolSize(); sleepBackoff = Math.min(TimeUnit.SECONDS.toMillis(10L), Math.min(HikariPool.this.connectionTimeout, (long)((double)sleepBackoff * 1.5D)))) {
PoolEntry poolEntry = HikariPool.this.createPoolEntry();
if (poolEntry != null) {
HikariPool.this.totalConnections.incrementAndGet();
HikariPool.this.connectionBag.add(poolEntry);
return Boolean.TRUE;
}
UtilityElf.quietlySleep(sleepBackoff);
}
return Boolean.FALSE;
}
复制代码
在其中调用createPoolEntry()
生成一个连接。
private PoolEntry createPoolEntry() {
try {
final PoolEntry poolEntry = this.newPoolEntry();
long maxLifetime = this.config.getMaxLifetime();
if (maxLifetime > 0L) {
long variance = maxLifetime > 10000L ? ThreadLocalRandom.current().nextLong(maxLifetime / 40L) : 0L;
long lifetime = maxLifetime - variance;
poolEntry.setFutureEol(this.houseKeepingExecutorService.schedule(new Runnable() {
public void run() {
HikariPool.this.softEvictConnection(poolEntry, "(connection has passed maxLifetime)", false);
}
}, lifetime, TimeUnit.MILLISECONDS));
}
this.LOGGER.debug("{} - Added connection {}", this.poolName, poolEntry.connection);
return poolEntry;
} catch (Exception var8) {
if (this.poolState == 0) {
this.LOGGER.debug("{} - Cannot acquire connection from data source", this.poolName, var8);
}
return null;
}
}
复制代码
在该方法中,设置了一个延时任务,具体的延时执行时间是根据maxLifetime来计算,触发时间距离maxlifetime的差值是根据 maxLifetime > 10_000 ? ThreadLocalRandom.current().nextLong( maxLifetime / 40 ) : 0;
来计算(up to 2.5% of the maxlifetime
),在连接存活将要到达maxLifetime之前触发evit,用来防止出现大面积的connection因maxLifetime同一时刻失效。
当被触发时,会标记evict
为true,标记为evict只是表示连接池中的该连接不可用
,但还在连接池当中,还会被borrow出来,只是getConnection的时候判断了,如果是isMarkedEvicted,则会从连接池中移除该连接,然后close掉。
HikariCP中通过独立的线程池closeConnectionExecutor进行物理连接的关闭。出现以下三种情况时会触发连接的自动关闭:
连接断开;
连接存活时间超出最大生存时间(maxLifeTime)
连接空闲时间超出最大空闲时间(idleTimeout)
closeConnectionExecutor关闭连接后,会调用fillPool()方法对连接池进行连接填充
validationTimeout
validationTimeout用来指定验证连接有效性的超时时间(默认是5秒,最小不能小于250毫秒
),在HikariPool.getConnection
方法中会调用isConnectionAlive(Connection connection)
对连接进行验证。
如果是jdbc4的话,可以使用isUseJdbc4Validation,是直接利用connection.isValid(validationSeconds)来验证连接的有效性;否则的话则用connectionTestQuery查询语句来查询验证。
leakDetectionThreshold`
该参数主要用来开启连接泄漏检测,在通过getConnection()