HikariDataSource初识

HikariCP 是面向 jdbc api 的数据库连接池,所以它肯定实现了 javax.sql.DataSource 接口

public class HikariDataSource extends HikariConfig implements DataSource, Closeable

HikariDataSource 继承了配置类 HikariConfig,个人感觉应该是持有的关系 不是继承关系

它提供了2个构造函数

  1. 无参默认构造函数
public HikariDataSource()
   {
      super();
      fastPathPool = null;
   }
  1. 传入配置
public HikariDataSource(HikariConfig configuration)
   {
      configuration.validate();
      configuration.copyStateTo(this);

      LOGGER.info("{} - Starting...", configuration.getPoolName());
      pool = fastPathPool = new HikariPool(this);
      LOGGER.info("{} - Start completed.", configuration.getPoolName());

      this.seal();
   }
  • 默认的构造函数,只是初始化了下父类,在首次 getConnection 的时候才去进行参数合法性的校验以及连接池的初始化,如果配置有问题就比较蛋疼了,没那么快发现;如下代码, 默认构造函数创建的ds,在首次 getConnection 时 double-check-lock 才进行配置校验和初始化
@Override
   public Connection getConnection() throws SQLException
   {
      if (isClosed()) {
         throw new SQLException("HikariDataSource " + this + " has been closed.");
      }

      if (fastPathPool != null) {
         return fastPathPool.getConnection();
      }
			// 无参构造函数 首次 getConnection 的逻辑, double-check-lock
      HikariPool result = pool;
      if (result == null) {
         synchronized (this) {
            result = pool;
            if (result == null) {
               validate();
               LOGGER.info("{} - Starting...", getPoolName());
               try {
                  pool = result = new HikariPool(this);
                  this.seal();
               }
               catch (PoolInitializationException pie) {
                  if (pie.getCause() instanceof SQLException) {
                     throw (SQLException) pie.getCause();
                  }
                  else {
                     throw pie;
                  }
               }
               LOGGER.info("{} - Start completed.", getPoolName());
            }
         }
      }

      return result.getConnection();
   }
  • 而有参构造函数里会先对配置进行有效性校验 configuration.validate(); 然后初始化连接池对象 fastPathPool = new HikariPool(this); HikariPool连接池初始化 并且 HikariPool 会尝试创建一个连接判断是否成功,如果失败则直接退出
  • 最后 this.seal(); 这个会禁止 schema、connectionInitSql、driverName、jdbcUrl 等配置的动态变更, 连接池的参数还是可以改的

推荐使用有参构造函数 public HikariDataSource(HikariConfig configuration),能在启动过程就校验配置有效性 快速失败

posted @ 2021-04-16 00:41  mushishi  阅读(2310)  评论(0编辑  收藏  举报