public DruidPooledConnection getConnectionDirect(long maxWaitMillis) throwsSQLException {int notFullTimeoutRetryCnt = 0;for(;;) {//handle notFullTimeoutRetry
DruidPooledConnection poolableConnection;try{
poolableConnection=getConnectionInternal(maxWaitMillis);
}catch(GetConnectionTimeoutException ex) {if (notFullTimeoutRetryCnt <= this.notFullTimeoutRetryCount && !isFull()) {
notFullTimeoutRetryCnt++;if(LOG.isWarnEnabled()) {
LOG.warn("get connection timeout retry : " +notFullTimeoutRetryCnt);
}continue;
}throwex;
}if(testOnBorrow) {boolean validate =testConnectionInternal(poolableConnection.holder, poolableConnection.conn);if (!validate) {if(LOG.isDebugEnabled()) {
LOG.debug("skip not validate connection.");
}
Connection realConnection=poolableConnection.conn;
discardConnection(realConnection);continue;
}
}else{
Connection realConnection=poolableConnection.conn;if(poolableConnection.conn.isClosed()) {
discardConnection(null); //传入null,避免重复关闭
continue;
}if(testWhileIdle) {long currentTimeMillis =System.currentTimeMillis();long lastActiveTimeMillis =poolableConnection.holder.lastActiveTimeMillis;long idleMillis = currentTimeMillis -lastActiveTimeMillis;long timeBetweenEvictionRunsMillis = this.timeBetweenEvictionRunsMillis;if (timeBetweenEvictionRunsMillis <= 0) {
timeBetweenEvictionRunsMillis=DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
}if (idleMillis >=timeBetweenEvictionRunsMillis|| idleMillis < 0 //unexcepted branch
) {boolean validate =testConnectionInternal(poolableConnection.holder, poolableConnection.conn);if (!validate) {if(LOG.isDebugEnabled()) {
LOG.debug("skip not validate connection.");
}
discardConnection(realConnection);continue;
}
}
}
}if(removeAbandoned) {
StackTraceElement[] stackTrace=Thread.currentThread().getStackTrace();
poolableConnection.connectStackTrace=stackTrace;
poolableConnection.setConnectedTimeNano();
poolableConnection.traceEnable= true;
activeConnectionLock.lock();try{
activeConnections.put(poolableConnection, PRESENT);
}finally{
activeConnectionLock.unlock();
}
}if (!this.defaultAutoCommit) {
poolableConnection.setAutoCommit(false);
}returnpoolableConnection;
}
}
本文详细介绍了Druid连接池中getConnectionDirect方法的具体实现,包括超时重试、连接有效性验证、空闲连接检查等关键步骤。通过分析源码,展示了如何高效地管理和使用数据库连接。
2636

被折叠的 条评论
为什么被折叠?



