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