• 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),能在启动过程就校验配置有效性 快速失败

    本文来自博客园,作者:mushishi,转载请注明原文链接:https://www.cnblogs.com/mushishi/p/14665225.html

  • 相关阅读:
    mysql的基础增删改查(一)
    用sql的avg(score)求完平均值后,保存两位小数的方法(用于查询或视图)
    异常java.lang.IllegalArgumentException:attempt to create delete event with null entity
    jsp传到java的control层的方法
    Java基础知识整理(一)
    DataTables warning (table id = 'DataTables_Table_0');错误解决办法!
    关于HTML学习整理(一)
    jQuery EasyUI 数据网格
    EasyUI DataGrid分页数据绑定
    SQL输出矩阵
  • 原文地址:https://www.cnblogs.com/mushishi/p/14665225.html
Copyright © 2020-2023  润新知