Minor cleanup (removal of redundant code). Testing JDBC 4.1 via getNetworkTimeout() is not viable on some drivers, but checking setNetworkTimeout() is.

pull/190/head
Brett Wooldridge 10 years ago
parent 5645839a7e
commit ca054975da

@ -29,7 +29,6 @@ import static com.zaxxer.hikari.util.PoolUtilities.executeSql;
import static com.zaxxer.hikari.util.PoolUtilities.getTransactionIsolation;
import static com.zaxxer.hikari.util.PoolUtilities.initializeDataSource;
import static com.zaxxer.hikari.util.PoolUtilities.isJdbc40Compliant;
import static com.zaxxer.hikari.util.PoolUtilities.isJdbc41Compliant;
import static com.zaxxer.hikari.util.PoolUtilities.quietlyCloseConnection;
import static com.zaxxer.hikari.util.PoolUtilities.quietlySleep;
import static com.zaxxer.hikari.util.PoolUtilities.setLoginTimeout;
@ -419,13 +418,12 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
try {
connection = (username == null && password == null) ? dataSource.getConnection() : dataSource.getConnection(username, password);
final boolean timeoutEnabled = (connectionTimeout != Integer.MAX_VALUE);
isUseNetworkTimeout = isJdbc41Compliant(connection) && timeoutEnabled;
isUseJdbc4Validation = isJdbc40Compliant(connection) && configuration.getConnectionTestQuery() == null;
if (!isUseJdbc4Validation && configuration.getConnectionTestQuery() == null) {
LOGGER.error("JDBC4 Connection.isValid() method not supported, connection test query must be configured");
}
final boolean timeoutEnabled = (connectionTimeout != Integer.MAX_VALUE);
final long timeoutMs = timeoutEnabled ? Math.max(250L, connectionTimeout) : 0L;
final int originalTimeout = setNetworkTimeout(houseKeepingExecutorService, connection, timeoutMs, isUseNetworkTimeout);

@ -252,35 +252,6 @@ public final class PoolUtilities
return IS_JDBC40;
}
/**
* Return true if the driver appears to be JDBC 4.1 compliant.
*
* @param connection a Connection to check
* @return true if JDBC 4.1 compliance, false otherwise
* @throws SQLException re-thrown exception from Connection.getNetworkTimeout()
*/
public static boolean isJdbc41Compliant(final Connection connection) throws SQLException
{
if (!jdbc41checked) {
jdbc41checked = true;
try {
IS_JDBC41 = connection.getNetworkTimeout() != Integer.MIN_VALUE; // This will throw AbstractMethodError or SQLException in the case of a non-JDBC 41 compliant driver
}
catch (SQLFeatureNotSupportedException e) {
IS_JDBC41 = false;
}
catch (AbstractMethodError e) {
IS_JDBC41 = false;
}
catch (NoSuchMethodError e) {
IS_JDBC41 = false;
}
}
return IS_JDBC41;
}
/**
* Set the query timeout, if it is supported by the driver.
*
@ -319,7 +290,9 @@ public final class PoolUtilities
*/
public static int setNetworkTimeout(final Executor executor, final Connection connection, final long timeoutMs, final boolean isUseNetworkTimeout) throws SQLException
{
if (isUseNetworkTimeout) {
if ((IS_JDBC41 || !jdbc41checked) && isUseNetworkTimeout) {
jdbc41checked = true;
try {
final int networkTimeout = connection.getNetworkTimeout();
connection.setNetworkTimeout(executor, (int) timeoutMs);

@ -28,7 +28,6 @@ import static com.zaxxer.hikari.util.PoolUtilities.executeSql;
import static com.zaxxer.hikari.util.PoolUtilities.getTransactionIsolation;
import static com.zaxxer.hikari.util.PoolUtilities.initializeDataSource;
import static com.zaxxer.hikari.util.PoolUtilities.isJdbc40Compliant;
import static com.zaxxer.hikari.util.PoolUtilities.isJdbc41Compliant;
import static com.zaxxer.hikari.util.PoolUtilities.quietlyCloseConnection;
import static com.zaxxer.hikari.util.PoolUtilities.quietlySleep;
import static com.zaxxer.hikari.util.PoolUtilities.setLoginTimeout;
@ -399,15 +398,14 @@ public final class HikariPool implements HikariPoolMBean, IBagStateListener
try {
connection = (username == null && password == null) ? dataSource.getConnection() : dataSource.getConnection(username, password);
final boolean timeoutEnabled = (connectionTimeout != Integer.MAX_VALUE);
isUseNetworkTimeout = isJdbc41Compliant(connection) && timeoutEnabled;
isUseJdbc4Validation = isJdbc40Compliant(connection) && configuration.getConnectionTestQuery() == null;
if (!isUseJdbc4Validation && configuration.getConnectionTestQuery() == null) {
LOGGER.error("JDBC4 Connection.isValid() method not supported, connection test query must be configured");
}
final boolean timeoutEnabled = (connectionTimeout != Integer.MAX_VALUE);
final long timeoutMs = timeoutEnabled ? Math.max(250L, connectionTimeout) : 0L;
final int originalTimeout = setNetworkTimeout(houseKeepingExecutorService, connection, timeoutMs, isUseNetworkTimeout);
final int originalTimeout = setNetworkTimeout(houseKeepingExecutorService, connection, timeoutMs, timeoutEnabled);
transactionIsolation = (transactionIsolation < 0 ? connection.getTransactionIsolation() : transactionIsolation);

@ -228,29 +228,6 @@ public final class PoolUtilities
return IS_JDBC40;
}
/**
* Return true if the driver appears to be JDBC 4.1 compliant.
*
* @param connection a Connection to check
* @return true if JDBC 4.1 compliance, false otherwise
* @throws SQLException re-thrown exception from Connection.getNetworkTimeout()
*/
public static boolean isJdbc41Compliant(final Connection connection) throws SQLException
{
if (!jdbc41checked) {
jdbc41checked = true;
try {
IS_JDBC41 = connection.getNetworkTimeout() != Integer.MIN_VALUE; // This will throw AbstractMethodError or SQLException in the case of a non-JDBC 41 compliant driver
}
catch (NoSuchMethodError | AbstractMethodError | SQLFeatureNotSupportedException e) {
IS_JDBC41 = false;
}
}
return IS_JDBC41;
}
/**
* Set the query timeout, if it is supported by the driver.
*
@ -283,7 +260,9 @@ public final class PoolUtilities
*/
public static int setNetworkTimeout(final Executor executor, final Connection connection, final long timeoutMs, final boolean isUseNetworkTimeout) throws SQLException
{
if (isUseNetworkTimeout) {
if ((IS_JDBC41 || !jdbc41checked) && isUseNetworkTimeout) {
jdbc41checked = true;
try {
final int networkTimeout = connection.getNetworkTimeout();
connection.setNetworkTimeout(executor, (int) timeoutMs);

Loading…
Cancel
Save