Prevent race in close()

pull/307/head
Mikhail Mazurskiy 10 years ago
parent 8da7ced9a8
commit ace24b3b9c

@ -22,6 +22,7 @@ import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException; import java.sql.SQLFeatureNotSupportedException;
import java.sql.Wrapper; import java.sql.Wrapper;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.sql.DataSource; import javax.sql.DataSource;
@ -43,7 +44,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea
{ {
private static final Logger LOGGER = LoggerFactory.getLogger(HikariDataSource.class); private static final Logger LOGGER = LoggerFactory.getLogger(HikariDataSource.class);
private volatile boolean isShutdown; private final AtomicBoolean isShutdown = new AtomicBoolean();
private final HikariPool fastPathPool; private final HikariPool fastPathPool;
private volatile HikariPool pool; private volatile HikariPool pool;
@ -78,7 +79,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea
@Override @Override
public Connection getConnection() throws SQLException public Connection getConnection() throws SQLException
{ {
if (isShutdown) { if (isShutdown.get()) {
throw new SQLException("Pool " + pool.getConfiguration().getPoolName() + " has been shutdown"); throw new SQLException("Pool " + pool.getConfiguration().getPoolName() + " has been shutdown");
} }
@ -232,7 +233,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea
*/ */
public void evictConnection(Connection connection) public void evictConnection(Connection connection)
{ {
if (!isShutdown && pool != null && connection instanceof IHikariConnectionProxy) { if (!isShutdown.get() && pool != null && connection instanceof IHikariConnectionProxy) {
pool.evictConnection((IHikariConnectionProxy) connection); pool.evictConnection((IHikariConnectionProxy) connection);
} }
} }
@ -243,7 +244,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea
*/ */
public void suspendPool() public void suspendPool()
{ {
if (!isShutdown && pool != null) { if (!isShutdown.get() && pool != null) {
pool.suspendPool(); pool.suspendPool();
} }
} }
@ -253,7 +254,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea
*/ */
public void resumePool() public void resumePool()
{ {
if (!isShutdown && pool != null) { if (!isShutdown.get() && pool != null) {
pool.resumePool(); pool.resumePool();
} }
} }
@ -264,12 +265,10 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea
@Override @Override
public void close() public void close()
{ {
if (isShutdown) { if (isShutdown.getAndSet(true)) {
return; return;
} }
isShutdown = true;
if (pool != null) { if (pool != null) {
try { try {
pool.shutdown(); pool.shutdown();
@ -291,7 +290,7 @@ public class HikariDataSource extends HikariConfig implements DataSource, Closea
*/ */
public boolean isClosed() public boolean isClosed()
{ {
return isShutdown; return isShutdown.get();
} }
/** /**

Loading…
Cancel
Save