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;
}
}