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

本文详细分析了HikariCP的HikariDataSource类中getConnection()方法的实现,包括连接池状态检查、双重检查锁机制,揭示了其高性能设计。通过理解源码,我们可以了解到AtomicBoolean在多线程环境中的作用,以及为何HikariCP使用两个连接池成员变量。此外,文章还介绍了双重检查锁的概念及其在减少锁竞争和保证初始化正确性方面的应用。
摘要由CSDN通过智能技术生成

HikariDataSource 的 getConnection()方法

HikariCP 获取连接的方法是com.zaxxer.hikari.HikariDataSource#getConnection(), 这个方法在HikariDataSource类中。HikariDataSource类中是 HikariCP 提供用户使用的主要类,有获取连接,关闭连接池,剔除连接等方法。我们主要看一下getConnection(), 这是对外暴露的获取连接的方法,不管是 Spring 获取连接还是我们自己手工调用 HikariCP,都是调用这个方法从连接池中取连接。

代码如下:

public Connection getConnection() throws SQLException {
      //①
      if (isClosed()) {
         throw new SQLException("HikariDataSource " + this + " has been closed.");
      }
      //②
      if (fastPathPool != null) {
         return fastPathPool.getConnection();
      }

      /**
       * ③
       * See http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java
       * GFC: 双重检查锁
       * https://www.cnblogs.com/xz816111/p/8470048.html
       * 如果是使用无参构造{@link #HikariDataSource()}初始化的HikariDataSource,那么默认是延迟构建HikariDataSource,
       * 在第一次获取连接的时候才构建HikariDataSource
       */
      HikariPool result = pool;
      //B才执行到这里
      if (result == null) {
         synchronized (this) {
            result = pool;
            if (result == null) {
               validate();
               //A 执行到打印日志
               LOGGER.info("{} - Started.", getPoolName());
               pool = result = new HikariPool(this);
            }
         }
      }

      return result.getConnection();
   }

其实一看,HikariDataSource 的getConnection()代码还是非常简单的,更多的细节,放在了 HikariPool 的getConnection()方法中。

但是,我们还是要分析一下的,毕竟,我们看开源代码的目的是学习大师的设计和技巧。

①检查连接池状态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值