Revert "Use System.nanoTime() instead of System.currentTimeMillis() almost everywhere. System.currentTimeMillis() can go backwards!"

This reverts commit 01bebb5d35.
2.3.0
Brett Wooldridge 10 years ago
parent 2260cc2e5f
commit a386815d7e

@ -66,7 +66,7 @@ import com.zaxxer.hikari.util.PoolUtilities;
public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListener
{
protected static final Logger LOGGER = LoggerFactory.getLogger("HikariPool");
private static final long ALIVE_BYPASS_WINDOW = TimeUnit.MILLISECONDS.toNanos(Long.getLong("com.zaxxer.hikari.aliveBypassWindow", 1000L));
private static final long ALIVE_BYPASS_WINDOW = Long.getLong("com.zaxxer.hikari.aliveBypassWindow", 1000L);
protected static final int POOL_RUNNING = 0;
protected static final int POOL_SUSPENDED = 1;
@ -154,7 +154,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen
long delayPeriod = Long.getLong("com.zaxxer.hikari.housekeeping.periodMs", TimeUnit.SECONDS.toMillis(30L));
ThreadFactory threadFactory = configuration.getThreadFactory() != null ? configuration.getThreadFactory() : new DefaultThreadFactory("Hikari Housekeeping Timer (pool " + configuration.getPoolName() + ")", true);
this.houseKeepingExecutorService = new ScheduledThreadPoolExecutor(1, threadFactory, new ThreadPoolExecutor.DiscardPolicy());
this.houseKeepingExecutorService.scheduleAtFixedRate(getHouseKeeper(), delayPeriod, delayPeriod, TimeUnit.MILLISECONDS);
this.houseKeepingExecutorService.scheduleAtFixedRate(getHouseKeeper(), TimeUnit.SECONDS.toMillis(10L), delayPeriod, TimeUnit.MILLISECONDS);
this.leakTask = (configuration.getLeakDetectionThreshold() == 0) ? LeakTask.NO_LEAK : new LeakTask(configuration.getLeakDetectionThreshold(), houseKeepingExecutorService);
setRemoveOnCancelPolicy(houseKeepingExecutorService);
@ -173,7 +173,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen
{
suspendResumeLock.acquire();
long timeout = connectionTimeout;
final long start = System.nanoTime();
final long start = System.currentTimeMillis();
final MetricsContext metricsContext = (isRecordMetrics ? metricsTracker.recordConnectionRequest(start) : MetricsTracker.NO_CONTEXT);
try {
@ -183,7 +183,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen
break; // We timed out... break and throw exception
}
final long now = System.nanoTime();
final long now = System.currentTimeMillis();
if (now - bagEntry.lastAccess > ALIVE_BYPASS_WINDOW && !isConnectionAlive(bagEntry.connection, timeout)) {
closeConnection(bagEntry); // Throw away the dead connection and try again
timeout = connectionTimeout - elapsedTimeMs(start);
@ -221,7 +221,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen
closeConnection(bagEntry);
}
else {
bagEntry.lastAccess = System.nanoTime();
bagEntry.lastAccess = System.currentTimeMillis();
connectionBag.requite(bagEntry);
}
}
@ -245,7 +245,7 @@ public abstract class BaseHikariPool implements HikariPoolMBean, IBagStateListen
addConnectionExecutor.shutdown();
addConnectionExecutor.awaitTermination(5L, TimeUnit.SECONDS);
final long start = System.nanoTime();
final long start = System.currentTimeMillis();
do {
softEvictConnections();
abortActiveConnections();

@ -42,7 +42,7 @@ public final class PoolBagEntry implements IConcurrentBagEntry
public PoolBagEntry(final Connection connection, final BaseHikariPool pool) {
this.connection = connection;
this.lastAccess = System.nanoTime();
this.lastAccess = System.currentTimeMillis();
final long maxLifetime = pool.configuration.getMaxLifetime();
if (maxLifetime > 0) {
@ -81,7 +81,7 @@ public final class PoolBagEntry implements IConcurrentBagEntry
public String toString()
{
return "Connection......" + connection + "\n"
+ " Last access.." + TimeUnit.NANOSECONDS.toMillis(lastAccess) + "\n"
+ " Last access.." + lastAccess + "\n"
+ " Last open....." + lastOpenTime + "\n"
+ " State........." + stateToString();
}

@ -49,12 +49,12 @@ public final class UtilityElf
/**
* Get the elapsed time in millisecond between the specified start time and now.
*
* @param startNanos the start time in nano-seconds
* @param start the start time
* @return the elapsed milliseconds
*/
public static long elapsedTimeMs(final long startNanos)
public static long elapsedTimeMs(final long start)
{
return TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos);
return System.currentTimeMillis() - start;
}
/**

@ -166,7 +166,7 @@ public class ShutdownTest
ds.close();
long start = System.nanoTime();
long start = System.currentTimeMillis();
while (UtilityElf.elapsedTimeMs(start) < TimeUnit.SECONDS.toMillis(5) && threadCount() > 0) {
UtilityElf.quietlySleep(250);
}

@ -38,14 +38,14 @@ public class TestConnectionCloseBlocking {
HikariDataSource ds = new HikariDataSource(config);
long start = System.nanoTime();
long start = System.currentTimeMillis();
try {
Connection connection = ds.getConnection();
connection.close();
// Hikari only checks for validity for connections with lastAccess > 1000 ms so we sleep for 1001 ms to force
// Hikari to do a connection validation which will fail and will trigger the connection to be closed
UtilityElf.quietlySleep(1001);
start = System.nanoTime();
start = System.currentTimeMillis();
connection = ds.getConnection(); // on physical connection close we sleep 2 seconds
Assert.assertTrue("Waited longer than timeout",
(UtilityElf.elapsedTimeMs(start) < config.getConnectionTimeout()));

@ -241,8 +241,8 @@ public final class HikariPool extends BaseHikariPool
connectionTimeout = configuration.getConnectionTimeout(); // refresh member in case it changed
final long now = System.nanoTime();
final long idleTimeout = TimeUnit.MILLISECONDS.toNanos(configuration.getIdleTimeout());
final long now = System.currentTimeMillis();
final long idleTimeout = configuration.getIdleTimeout();
for (PoolBagEntry bagEntry : connectionBag.values(STATE_NOT_IN_USE)) {
if (connectionBag.reserve(bagEntry)) {

@ -218,8 +218,8 @@ public final class HikariPool extends BaseHikariPool
connectionTimeout = configuration.getConnectionTimeout(); // refresh member in case it changed
final long now = System.nanoTime();
final long idleTimeout = TimeUnit.MILLISECONDS.toNanos(configuration.getIdleTimeout());
final long now = System.currentTimeMillis();
final long idleTimeout = configuration.getIdleTimeout();
connectionBag.values(STATE_NOT_IN_USE).stream().filter(p -> connectionBag.reserve(p)).forEach(bagEntry -> {
if (bagEntry.evicted || (idleTimeout > 0L && now > bagEntry.lastAccess + idleTimeout)) {

Loading…
Cancel
Save