pull/253/head
Brett Wooldridge 10 years ago
parent 34e58dfb2b
commit 8af2bc551a

@ -7,6 +7,8 @@ import java.sql.SQLException;
import java.sql.Statement; import java.sql.Statement;
import java.util.Properties; import java.util.Properties;
import java.util.concurrent.Executor; import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import javax.sql.DataSource; import javax.sql.DataSource;
@ -15,6 +17,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.zaxxer.hikari.HikariConfig; import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.util.DefaultThreadFactory;
import com.zaxxer.hikari.util.DriverDataSource; import com.zaxxer.hikari.util.DriverDataSource;
import com.zaxxer.hikari.util.PropertyBeanSetter; import com.zaxxer.hikari.util.PropertyBeanSetter;
@ -22,7 +25,7 @@ public final class PoolUtilities
{ {
private static final Logger LOGGER = LoggerFactory.getLogger(PoolUtilities.class); private static final Logger LOGGER = LoggerFactory.getLogger(PoolUtilities.class);
private final Executor synchronousExecutor; private Executor netTimeoutExecutor;
private String poolName; private String poolName;
private volatile boolean isValidChecked; private volatile boolean isValidChecked;
@ -36,7 +39,6 @@ public final class PoolUtilities
this.isValidSupported = true; this.isValidSupported = true;
this.isNetworkTimeoutSupported = true; this.isNetworkTimeoutSupported = true;
this.isQueryTimeoutSupported = true; this.isQueryTimeoutSupported = true;
this.synchronousExecutor = new SynchronousExecutor();
} }
/** /**
@ -94,16 +96,23 @@ public final class PoolUtilities
*/ */
public DataSource initializeDataSource(final String dsClassName, DataSource dataSource, final Properties dataSourceProperties, final String jdbcUrl, final String username, final String password) public DataSource initializeDataSource(final String dsClassName, DataSource dataSource, final Properties dataSourceProperties, final String jdbcUrl, final String username, final String password)
{ {
if (dataSource == null && dsClassName != null) { try {
dataSource = createInstance(dsClassName, DataSource.class); if (dataSource == null && dsClassName != null) {
PropertyBeanSetter.setTargetFromProperties(dataSource, dataSourceProperties); dataSource = createInstance(dsClassName, DataSource.class);
PropertyBeanSetter.setTargetFromProperties(dataSource, dataSourceProperties);
return dataSource;
}
else if (jdbcUrl != null) {
return new DriverDataSource(jdbcUrl, dataSourceProperties, username, password);
}
return dataSource; return dataSource;
} }
else if (jdbcUrl != null) { finally {
return new DriverDataSource(jdbcUrl, dataSourceProperties, username, password); if (dataSource != null) {
createNetworkTimeoutExecutor(dataSource, dsClassName, jdbcUrl);
}
} }
return dataSource;
} }
/** /**
@ -183,7 +192,7 @@ public final class PoolUtilities
if (isNetworkTimeoutSupported) { if (isNetworkTimeoutSupported) {
try { try {
final int networkTimeout = connection.getNetworkTimeout(); final int networkTimeout = connection.getNetworkTimeout();
connection.setNetworkTimeout(synchronousExecutor, (int) timeoutMs); connection.setNetworkTimeout(netTimeoutExecutor, (int) timeoutMs);
return networkTimeout; return networkTimeout;
} }
catch (Throwable e) { catch (Throwable e) {
@ -206,7 +215,7 @@ public final class PoolUtilities
{ {
if (isNetworkTimeoutSupported) { if (isNetworkTimeoutSupported) {
try { try {
connection.setNetworkTimeout(synchronousExecutor, (int) timeoutMs); connection.setNetworkTimeout(netTimeoutExecutor, (int) timeoutMs);
} }
catch (Throwable e) { catch (Throwable e) {
LOGGER.warn("Unable to reset network timeout for connection {} in pool {}", connection.toString(), poolName, e); LOGGER.warn("Unable to reset network timeout for connection {} in pool {}", connection.toString(), poolName, e);
@ -232,6 +241,20 @@ public final class PoolUtilities
} }
} }
// Temporary hack for MySQL issue: http://bugs.mysql.com/bug.php?id=75615
private void createNetworkTimeoutExecutor(final DataSource dataSource, final String dsClassName, final String jdbcUrl)
{
if ((dsClassName != null && dsClassName.contains("Mysql")) ||
(jdbcUrl != null && jdbcUrl.contains("mysql")) ||
(dataSource != null && dataSource.getClass().getName().contains("Mysql"))) {
netTimeoutExecutor = new SynchronousExecutor();
}
else {
netTimeoutExecutor = Executors.newCachedThreadPool(new DefaultThreadFactory("Hikari JDBC Timeout Executor", true));
((ThreadPoolExecutor) netTimeoutExecutor).allowCoreThreadTimeOut(true);
}
}
private static class SynchronousExecutor implements Executor private static class SynchronousExecutor implements Executor
{ {
/** {@inheritDoc} */ /** {@inheritDoc} */

Loading…
Cancel
Save