|
|
@ -631,15 +631,22 @@ public class HikariPool implements HikariPoolMXBean, IBagStateListener
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
logPoolState("Before cleanup ");
|
|
|
|
logPoolState("Before cleanup ");
|
|
|
|
final List<PoolBagEntry> bag = connectionBag.values(STATE_NOT_IN_USE);
|
|
|
|
boolean evicted = false;
|
|
|
|
|
|
|
|
List<PoolBagEntry> bag = connectionBag.values(STATE_NOT_IN_USE);
|
|
|
|
|
|
|
|
for (PoolBagEntry bagEntry : bag) {
|
|
|
|
|
|
|
|
if (bagEntry.evicted) {
|
|
|
|
|
|
|
|
closeConnection(bagEntry, "(connection evicted)");
|
|
|
|
|
|
|
|
evicted = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (evicted) {
|
|
|
|
|
|
|
|
//get fresh bag
|
|
|
|
|
|
|
|
bag = connectionBag.values(STATE_NOT_IN_USE);
|
|
|
|
|
|
|
|
}
|
|
|
|
int removable = bag.size() - config.getMinimumIdle();
|
|
|
|
int removable = bag.size() - config.getMinimumIdle();
|
|
|
|
for (PoolBagEntry bagEntry : bag) {
|
|
|
|
for (PoolBagEntry bagEntry : bag) {
|
|
|
|
if (connectionBag.reserve(bagEntry)) {
|
|
|
|
if (connectionBag.reserve(bagEntry)) {
|
|
|
|
if (bagEntry.evicted) {
|
|
|
|
if (removable > 0 && idleTimeout > 0L && clockSource.elapsedMillis(bagEntry.lastAccess, now) > idleTimeout) {
|
|
|
|
closeConnection(bagEntry, "(connection evicted)");
|
|
|
|
|
|
|
|
removable--;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (removable > 0 && idleTimeout > 0L && clockSource.elapsedMillis(bagEntry.lastAccess, now) > idleTimeout) {
|
|
|
|
|
|
|
|
closeConnection(bagEntry, "(connection passed idleTimeout)");
|
|
|
|
closeConnection(bagEntry, "(connection passed idleTimeout)");
|
|
|
|
removable--;
|
|
|
|
removable--;
|
|
|
|
}
|
|
|
|
}
|
|
|
|