二、HikariCP 源码分析之获取连接流程二

本文深入解析HikariPool的getConnection()方法,探讨HikariCP如何获取数据库连接及挂起连接池的实现原理。分析了Semaphore在挂起连接池中的作用,解释了挂起功能的使用场景和优化措施,并介绍了连接超时的处理方式。
摘要由CSDN通过智能技术生成

HikariPool 的 getConnection()方法

在上一篇《HikariCP 获取连接流程源码分析一》中,我们分析了 HikariDataSource 的getConnection()方法,而这个方法,其实详细的实现细节都是在 HikariPool 的 getConnection()方法中,我们来分析下 HikariPool 的 getConnection()方法。

代码如下:

public final Connection getConnection() throws SQLException {
      return getConnection(connectionTimeout);
   }

这里又调用了一个有参的 getConnection()方法,但是我们并没有传参数 connectionTimeout,这个是哪里来的呢?这个其实就是用户在初始化连接池的时候设置的参数connectionTimeout,它表示获取连接的超时时间,不配置的话默认值 30 秒。我们继续看下getConnection(connectionTimeout);的实现:

public final Connection getConnection(final long hardTimeout) throws SQLException {
      //①
      //获取连接的时候申请令牌, 主要是为了连接池挂起的时候, 控制用户不能获取连接
      //当连接池挂起的时候, Semaphore的 10000 个令牌都会被占用, 此处就会一直阻塞线程等待令牌
      suspendResumeLock.acquire();
      //记录获取连接的开始时间, 用于超时判断
      final long startTime = clockSource.currentTime();

      try {
         long timeout = hardTimeout;
         do {
            //②
            //从连接池获取连接, 超时时间timeout
            final PoolEntry poolEntry = connectionBag.borrow(timeout, MILLISECONDS);
            //borrow方法在超时的时候才会返回 null
            if (poolEntry == null) {
               break; // We timed out... break and throw exception
            }

            final long now = clockSource.currentTime();
            //③
            //获取连接的时候, 判断连接是否已经被标记移除
            if (poolEntry.isMarkedEvicted() || (clockSource.elapsedMillis(poolEntry.lastAccessed, now) > ALIVE_BYPASS_WINDOW_MS && !isConnectionAlive(poolEntry.connection))) {
               //如果连接超出max
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值