HikariCP 是面向 jdbc api 的數據庫連接池,所以它肯定實現了 javax.sql.DataSource
接口
public class HikariDataSource extends HikariConfig implements DataSource, Closeable
HikariDataSource 繼承了配置類 HikariConfig,個人感覺應該是持有的關系 不是繼承關系
它提供了2個構造函數
- 無參默認構造函數
public HikariDataSource()
{
super();
fastPathPool = null;
}
- 傳入配置
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),能在啟動過程就校驗配置有效性 快速失敗