HikariDataSource 的 getConnection()方法
HikariCP 获取连接的方法是com.zaxxer.hikari.HikariDataSource#getConnection(), 这个方法在HikariDataSource类中。HikariDataSource类中是 HikariCP 提供用户使用的主要类,有获取连接,关闭连接池,剔除连接等方法。我们主要看一下getConnection(), 这是对外暴露的获取连接的方法,不管是 Spring 获取连接还是我们自己手工调用 HikariCP,都是调用这个方法从连接池中取连接。
代码如下:
public Connection getConnection() throws SQLException {
//①
if (isClosed()) {
throw new SQLException("HikariDataSource " + this + " has been closed.");
}
//②
if (fastPathPool != null) {
return fastPathPool.getConnection();
}
/**
* ③
* See http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java
* GFC: 双重检查锁
* https://www.cnblogs.com/xz816111/p/8470048.html
* 如果是使用无参构造{@link #HikariDataSource()}初始化的HikariDataSource,那么默认是延迟构建HikariDataSource,
* 在第一次获取连接的时候才构建HikariDataSource
*/
HikariPool result = pool;
//B才执行到这里
if (result == null) {
synchronized (this) {
result = pool;
if (result == null) {
validate();
//A 执行到打印日志
LOGGER.info("{} - Started.", getPoolName());
pool = result = new HikariPool(this);
}
}
}
return result.getConnection();
}
其实一看,HikariDataSource 的getConnection()代码还是非常简单的,更多的细节,放在了 HikariPool 的getConnection()方法中。
但是,我们还是要分析一下的,毕竟,我们看开源代码的目的是学习大师的设计和技巧。