Improve accuracy of pool stat reporting (at a slight performance cost).

pull/192/head
Brett Wooldridge 11 years ago
parent e1e4a50f1f
commit 6818783370

@ -18,6 +18,7 @@ package com.zaxxer.hikari.pool;
import static com.zaxxer.hikari.util.ConcurrentBag.STATE_IN_USE;
import static com.zaxxer.hikari.util.ConcurrentBag.STATE_NOT_IN_USE;
import static com.zaxxer.hikari.util.ConcurrentBag.STATE_REMOVED;
import static com.zaxxer.hikari.util.PoolUtilities.IS_JAVA7;
import static com.zaxxer.hikari.util.PoolUtilities.createInstance;
import static com.zaxxer.hikari.util.PoolUtilities.createThreadPoolExecutor;
@ -351,7 +352,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
@Override
public int getActiveConnections()
{
return Math.min(configuration.getMaximumPoolSize(), totalConnections.get() - getIdleConnections());
return connectionBag.getCount(STATE_IN_USE);
}
/** {@inheritDoc} */
@ -365,7 +366,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
@Override
public int getTotalConnections()
{
return totalConnections.get();
return connectionBag.size() - connectionBag.getCount(STATE_REMOVED);
}
/** {@inheritDoc} */
@ -579,10 +580,11 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
private void logPoolState(String... prefix)
{
int total = totalConnections.get();
int idle = getIdleConnections();
LOGGER.debug("{}pool stats {} (total={}, inUse={}, avail={}, waiting={})", (prefix.length > 0 ? prefix[0] : ""), configuration.getPoolName(), total,
total - idle, idle, getThreadsAwaitingConnection());
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("{}pool stats {} (total={}, inUse={}, avail={}, waiting={})",
(prefix.length > 0 ? prefix[0] : ""), configuration.getPoolName(),
getTotalConnections(), getActiveConnections(), getIdleConnections(), getThreadsAwaitingConnection());
}
}
/**

@ -57,7 +57,7 @@ public final class ConcurrentBag<T extends BagEntry>
public static final int STATE_NOT_IN_USE = 0;
public static final int STATE_IN_USE = 1;
private static final int STATE_REMOVED = -1;
public static final int STATE_REMOVED = -1;
private static final int STATE_RESERVED = -2;
public static abstract class BagEntry

@ -56,7 +56,7 @@ public class ShutdownTest
HikariConfig config = new HikariConfig();
config.setMinimumIdle(0);
config.setMaximumPoolSize(10);
config.setInitializationFailFast(true);
config.setInitializationFailFast(false);
config.setConnectionTestQuery("VALUES 1");
config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource");
@ -81,7 +81,7 @@ public class ShutdownTest
threads[i].start();
}
PoolUtilities.quietlySleep(300);
PoolUtilities.quietlySleep(1200);
Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() > 0);
@ -109,7 +109,7 @@ public class ShutdownTest
HikariDataSource ds = new HikariDataSource(config);
HikariPool pool = TestElf.getPool(ds);
PoolUtilities.quietlySleep(300);
PoolUtilities.quietlySleep(1200);
Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() > 0);
@ -125,8 +125,6 @@ public class ShutdownTest
{
Assert.assertSame("StubConnection count not as expected", 0, StubConnection.count.get());
StubConnection.slowCreate = true;
HikariConfig config = new HikariConfig();
config.setMinimumIdle(5);
config.setMaximumPoolSize(5);
@ -137,8 +135,6 @@ public class ShutdownTest
HikariDataSource ds = new HikariDataSource(config);
HikariPool pool = TestElf.getPool(ds);
PoolUtilities.quietlySleep(300);
Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() == 5);
ds.close();
@ -179,8 +175,6 @@ public class ShutdownTest
{
Assert.assertSame("StubConnection count not as expected", 0, StubConnection.count.get());
StubConnection.slowCreate = false;
HikariConfig config = new HikariConfig();
config.setMinimumIdle(5);
config.setMaximumPoolSize(5);

@ -18,6 +18,7 @@ package com.zaxxer.hikari.pool;
import static com.zaxxer.hikari.util.ConcurrentBag.STATE_IN_USE;
import static com.zaxxer.hikari.util.ConcurrentBag.STATE_NOT_IN_USE;
import static com.zaxxer.hikari.util.ConcurrentBag.STATE_REMOVED;
import static com.zaxxer.hikari.util.PoolUtilities.createInstance;
import static com.zaxxer.hikari.util.PoolUtilities.createThreadPoolExecutor;
import static com.zaxxer.hikari.util.PoolUtilities.elapsedTimeMs;
@ -342,7 +343,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
@Override
public int getActiveConnections()
{
return Math.min(configuration.getMaximumPoolSize(), totalConnections.get() - getIdleConnections());
return connectionBag.getCount(STATE_IN_USE);
}
/** {@inheritDoc} */
@ -356,7 +357,7 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
@Override
public int getTotalConnections()
{
return totalConnections.get();
return connectionBag.size() - connectionBag.getCount(STATE_REMOVED);
}
/** {@inheritDoc} */
@ -558,10 +559,11 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
private void logPoolState(String... prefix)
{
int total = totalConnections.get();
int idle = getIdleConnections();
LOGGER.debug("{}pool stats {} (total={}, inUse={}, avail={}, waiting={})", (prefix.length > 0 ? prefix[0] : ""), configuration.getPoolName(), total,
total - idle, idle, getThreadsAwaitingConnection());
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("{}pool stats {} (total={}, inUse={}, avail={}, waiting={})",
(prefix.length > 0 ? prefix[0] : ""), configuration.getPoolName(),
getTotalConnections(), getActiveConnections(), getIdleConnections(), getThreadsAwaitingConnection());
}
}
/**

@ -56,7 +56,7 @@ public final class ConcurrentBag<T extends BagEntry>
public static final int STATE_NOT_IN_USE = 0;
public static final int STATE_IN_USE = 1;
private static final int STATE_REMOVED = -1;
public static final int STATE_REMOVED = -1;
private static final int STATE_RESERVED = -2;
public static abstract class BagEntry

@ -56,7 +56,7 @@ public class ShutdownTest
HikariConfig config = new HikariConfig();
config.setMinimumIdle(0);
config.setMaximumPoolSize(10);
config.setInitializationFailFast(true);
config.setInitializationFailFast(false);
config.setConnectionTestQuery("VALUES 1");
config.setDataSourceClassName("com.zaxxer.hikari.mocks.StubDataSource");
@ -81,7 +81,7 @@ public class ShutdownTest
threads[i].start();
}
PoolUtilities.quietlySleep(300);
PoolUtilities.quietlySleep(1200);
Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() > 0);
@ -109,7 +109,7 @@ public class ShutdownTest
HikariDataSource ds = new HikariDataSource(config);
HikariPool pool = TestElf.getPool(ds);
PoolUtilities.quietlySleep(300);
PoolUtilities.quietlySleep(1200);
Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() > 0);
@ -125,8 +125,6 @@ public class ShutdownTest
{
Assert.assertSame("StubConnection count not as expected", 0, StubConnection.count.get());
StubConnection.slowCreate = true;
HikariConfig config = new HikariConfig();
config.setMinimumIdle(5);
config.setMaximumPoolSize(5);
@ -137,8 +135,6 @@ public class ShutdownTest
HikariDataSource ds = new HikariDataSource(config);
HikariPool pool = TestElf.getPool(ds);
PoolUtilities.quietlySleep(300);
Assert.assertTrue("Totals connection count not as expected, ", pool.getTotalConnections() == 5);
ds.close();
@ -179,8 +175,6 @@ public class ShutdownTest
{
Assert.assertSame("StubConnection count not as expected", 0, StubConnection.count.get());
StubConnection.slowCreate = false;
HikariConfig config = new HikariConfig();
config.setMinimumIdle(5);
config.setMaximumPoolSize(5);

Loading…
Cancel
Save