00515 {
00516
long idleTime, releaseTime;
00517
synchronized (
this)
00518 {
00519
try
00520 {
00521
while (!
isKilled)
00522 {
00523
00524
00525
if (freeConnections.isEmpty()
00526 || (freeConnections.size() == minPoolSize))
00527 {
00528 wait();
00529 }
00530
00531 Connection c = null;
00532
synchronized (freeConnections)
00533 {
00534
if (releaseTimes.isEmpty())
00535
continue;
00536
00537 releaseTime = ((Long) releaseTimes.get(0)).longValue();
00538 idleTime = System.currentTimeMillis() - releaseTime;
00539
00540
if (idleTime >= idleTimeout)
00541 c = (Connection) freeConnections.remove(0);
00542 }
00543
00544
if (c == null)
00545 {
00546 wait(idleTimeout - idleTime);
00547 }
00548
else
00549 {
00550
try
00551 {
00552 c.close();
00553 }
00554
catch (SQLException e)
00555 {
00556 String msg =
"An error occured while closing idle connection after the timeout: "
00557 + e;
00558 logger.error(msg);
00559 }
00560 finally
00561 {
00562 releaseTimes.remove(0);
00563 poolSize--;
00564 }
00565 logger.debug(
"Released idle connection (idle timeout reached)");
00566
continue;
00567
00568 }
00569 }
00570 }
00571
catch (InterruptedException e)
00572 {
00573 logger
00574 .error(
"Wait on removeIdleConnectionsThread interrupted in VariablePoolConnectionManager: "
00575 + e);
00576 }
00577 }
00578 }