HikariPool
2021-09-06 17:15:02 0 举报
AI智能生成
HikariPool 全网独一份
作者其他创作
大纲/内容
HikariDataSource
HikariDataSource(HikariConfig configuration)
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()
validate();
pool = result = new HikariPool(this);
this.seal();
HikariPool.getConnection();
getLoginTimeout()
public int getLoginTimeout() throws SQLException
{
HikariPool p = pool;
return (p != null ? p.getUnwrappedDataSource().getLoginTimeout() : 0);
}
evictConnection
public void evictConnection(Connection connection)
{
HikariPool p;
if (!isClosed() && (p = pool) != null && connection.getClass().getName().startsWith("com.zaxxer.hikari")) {
p.evictConnection(connection);
}
}
ProxyConnection
ProxyConnection()
protected ProxyConnection(final PoolEntry poolEntry, final Connection connection, final FastList<Statement> openStatements, final ProxyLeakTask leakTask, final long now, final boolean isReadOnly, final boolean isAutoCommit) {
this.poolEntry = poolEntry;
this.delegate = connection;
this.openStatements = openStatements;
this.leakTask = leakTask;
this.lastAccess = now;
this.isReadOnly = isReadOnly;
this.isAutoCommit = isAutoCommit;
}
this.poolEntry = poolEntry;
this.delegate = connection;
this.openStatements = openStatements;
this.leakTask = leakTask;
this.lastAccess = now;
this.isReadOnly = isReadOnly;
this.isAutoCommit = isAutoCommit;
}
close()
closeStatements();
leakTask.cancel();
delegate.rollback();
poolEntry.resetConnectionState(this, dirtyBits);
delegate = ClosedConnection.CLOSED_CONNECTION;
poolEntry.recycle(lastAccess);
void recycle(final long lastAccessed)
{
if (connection != null) {
this.lastAccessed = lastAccessed;
hikariPool.recycle(this);
}
}
connectionBag.requite(poolEntry);
bagEntry.setState(STATE_NOT_IN_USE);
HikariPool(final HikariConfig config)
this.connectionBag = new ConcurrentBag<>(this);
getConnection(connectionTimeout)
suspendResumeLock.acquire()
PoolEntry poolEntry = connectionBag.borrow(timeout, MILLISECONDS);
final long now = currentTime();
if (poolEntry.isMarkedEvicted() || (elapsedMillis(poolEntry.lastAccessed, now) > aliveBypassWindowMs && !isConnectionAlive(poolEntry.connection))) {
closeConnection(poolEntry, poolEntry.isMarkedEvicted() ? EVICTED_CONNECTION_MESSAGE : DEAD_CONNECTION_MESSAGE);
timeout = hardTimeout - elapsedMillis(startTime);
}
else {
metricsTracker.recordBorrowStats(poolEntry, startTime);
return poolEntry.createProxyConnection(leakTaskFactory.schedule(poolEntry), now);
}
metricsTracker.recordBorrowTimeoutStats(startTime);
throw createTimeoutException(startTime);
suspendResumeLock.release();
checkFailFast()
createPoolEntry()
newPoolEntry()
return new PoolEntry(newConnection(), this, isReadOnly, isAutoCommit);
final PoolEntry poolEntry = newPoolEntry();
final long maxLifetime = config.getMaxLifetime();
if (maxLifetime > 0) {
// variance up to 2.5% of the maxlifetime
final long variance = maxLifetime > 10_000 ? ThreadLocalRandom.current().nextLong( maxLifetime / 40 ) : 0;
final long lifetime = maxLifetime - variance;
poolEntry.setFutureEol(houseKeepingExecutorService.schedule(
() -> {
if (softEvictConnection(poolEntry, "(connection has passed maxLifetime)", false /* not owner */)) {
addBagItem(connectionBag.getWaitingThreadCount());
}
},
lifetime, MILLISECONDS));
}
return poolEntry;
addBagItem(connectionBag.getWaitingThreadCount());
public void addBagItem(final int waiting)
{
final boolean shouldAdd = waiting - addConnectionQueue.size() >= 0; // Yes, >= is intentional.
if (shouldAdd) {
addConnectionExecutor.submit(poolEntryCreator);
}
}
connectionBag.add(poolEntry);
quietlyCloseConnection(poolEntry.close(), "(initialization check complete and minimumIdle is zero)");
recycle(final PoolEntry poolEntry)
connectionBag.requite(poolEntry);
public void requite(final T bagEntry)
{
bagEntry.setState(STATE_NOT_IN_USE);
for (int i = 0; waiters.get() > 0; i++) {
if (bagEntry.getState() != STATE_NOT_IN_USE || handoffQueue.offer(bagEntry)) {
return;
}
else if ((i & 0xff) == 0xff) {
parkNanos(MICROSECONDS.toNanos(10));
}
else {
yield();
}
}
getActiveConnections()
return connectionBag.getCount(STATE_IN_USE);
closeConnection(final PoolEntry poolEntry, final String closureReason)
void closeConnection(final PoolEntry poolEntry, final String closureReason)
{
if (connectionBag.remove(poolEntry)) {
final Connection connection = poolEntry.close();
closeConnectionExecutor.execute(() -> {
quietlyCloseConnection(connection, closureReason);
if (poolState == POOL_NORMAL) {
fillPool();
}
});
}
}
getIdleConnections()
return connectionBag.getCount(STATE_NOT_IN_USE);
getTotalConnections()
connectionBag.size();
resumePool()
fillPool()
private synchronized void fillPool()
{
final int connectionsToAdd = Math.min(config.getMaximumPoolSize() - getTotalConnections(), config.getMinimumIdle() - getIdleConnections())
- addConnectionQueue.size();
for (int i = 0; i < connectionsToAdd; i++) {
addConnectionExecutor.submit((i < connectionsToAdd - 1) ? poolEntryCreator : postFillPoolEntryCreator);
}
}
shutdown
addConnectionExecutor.shutdown();
destroyHouseKeepingExecutorService();
connectionBag.close();
abortActiveConnections(assassinExecutor);
softEvictConnections();
assassinExecutor.shutdown();
assassinExecutor.awaitTermination(10L, SECONDS);
shutdownNetworkTimeoutExecutor();
closeConnectionExecutor.shutdown();
closeConnectionExecutor.awaitTermination(10L, SECONDS);
handleMBeans(this, false);
收藏
0 条评论
下一页
为你推荐
查看更多