hikaricp 连接池分析_hikari连接池解析(版本:HikariCP-2.5.1.jar)

本文详细介绍了HikariCP连接池的工作原理,包括maxLifetime参数的设定、连接初始化过程、连接回收策略以及异常处理。特别提到了maxLifetime需小于数据库的time_wait,以避免超时问题。此外,文章还分析了HouseKeeper的运行机制,如时间回拨处理和保持最小连接的逻辑。最后,讨论了minimumIdle配置可能导致的问题以及解决方法,以及连接超时可能的原因和排查思路。对于使用HikariCP的开发者来说,理解这些细节有助于优化数据库连接池的性能。
摘要由CSDN通过智能技术生成

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值