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),能在啟動過程就校驗配置有效性 快速失敗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM