From 196632b82ebb52211bbecbc09a863ef3460824af Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Thu, 12 Feb 2015 12:04:52 +0900 Subject: [PATCH 1/4] Experimental change for #260 to allow looking up Dropwizard MetricRegistry or HealthCheckRegistry via JNDI (for example in Tomcat). --- hikaricp-common/pom.xml | 10 +---- .../zaxxer/hikari/AbstractHikariConfig.java | 41 +++++++++++++++++-- pom.xml | 2 +- 3 files changed, 39 insertions(+), 14 deletions(-) diff --git a/hikaricp-common/pom.xml b/hikaricp-common/pom.xml index d9430900..51959823 100644 --- a/hikaricp-common/pom.xml +++ b/hikaricp-common/pom.xml @@ -13,14 +13,6 @@ com.zaxxer HikariCP-parent - 2.3.2-SNAPSHOT + 2.3.3-SNAPSHOT - - - - com.zaxxer - HikariCP - 2.3.2-SNAPSHOT - - \ No newline at end of file diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java index e6a97ac0..33912212 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java @@ -26,11 +26,16 @@ import java.util.TreeSet; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; +import javax.naming.Context; +import javax.naming.InitialContext; +import javax.naming.NamingException; import javax.sql.DataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.codahale.metrics.MetricRegistry; +import com.codahale.metrics.health.HealthCheckRegistry; import com.zaxxer.hikari.util.PropertyBeanSetter; import com.zaxxer.hikari.util.UtilityElf; @@ -496,9 +501,23 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean */ public void setMetricRegistry(Object metricRegistry) { - if (metricRegistry != null && !metricRegistry.getClass().getName().contains("MetricRegistry")) { - throw new IllegalArgumentException("Class must be an instance of com.codahale.metrics.MetricRegistry"); + if (metricRegistry != null) { + if (metricRegistry instanceof String) { + try { + InitialContext initCtx = new InitialContext(); + Context envCtx = (Context) initCtx.lookup("java:comp/env"); + metricRegistry = (MetricRegistry) envCtx.lookup((String) metricRegistry); + } + catch (NamingException e) { + throw new IllegalArgumentException(e); + } + } + + if (!(metricRegistry instanceof MetricRegistry)) { + throw new IllegalArgumentException("Class must be an instance of com.codahale.metrics.MetricRegistry"); + } } + this.metricRegistry = metricRegistry; } @@ -519,9 +538,23 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean */ public void setHealthCheckRegistry(Object healthCheckRegistry) { - if (healthCheckRegistry != null && !healthCheckRegistry.getClass().getName().contains("HealthCheckRegistry")) { - throw new IllegalArgumentException("Class must be an instance of com.codahale.metrics.health.HealthCheckRegistry"); + if (healthCheckRegistry != null) { + if (healthCheckRegistry instanceof String) { + try { + InitialContext initCtx = new InitialContext(); + Context envCtx = (Context) initCtx.lookup("java:comp/env"); + healthCheckRegistry = (MetricRegistry) envCtx.lookup((String) healthCheckRegistry); + } + catch (NamingException e) { + throw new IllegalArgumentException(e); + } + } + + if (!(healthCheckRegistry instanceof HealthCheckRegistry)) { + throw new IllegalArgumentException("Class must be an instance of com.codahale.metrics.health.HealthCheckRegistry"); + } } + this.healthCheckRegistry = healthCheckRegistry; } diff --git a/pom.xml b/pom.xml index 3567197c..a5995b5d 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.zaxxer HikariCP-parent - 2.3.2 + 2.3.3-SNAPSHOT pom HikariCP-parent From c3cda56d920842738e1d4f5c051f950b92fe00b9 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Thu, 12 Feb 2015 12:10:48 +0900 Subject: [PATCH 2/4] Update poms #260 --- hikaricp-java6/pom.xml | 2 +- hikaricp/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/hikaricp-java6/pom.xml b/hikaricp-java6/pom.xml index a9a71a46..f2672303 100644 --- a/hikaricp-java6/pom.xml +++ b/hikaricp-java6/pom.xml @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.2 + 2.3.3-SNAPSHOT diff --git a/hikaricp/pom.xml b/hikaricp/pom.xml index 020f8140..72ad807f 100644 --- a/hikaricp/pom.xml +++ b/hikaricp/pom.xml @@ -47,7 +47,7 @@ com.zaxxer HikariCP-parent - 2.3.2 + 2.3.3-SNAPSHOT From 701517d3b86ddf230b13bbb76840341ca803d5cd Mon Sep 17 00:00:00 2001 From: johnon Date: Wed, 18 Feb 2015 12:55:56 -0800 Subject: [PATCH 3/4] Allows Hikari to look up an arbitary JNDI resource name for the metric registry --- .../main/java/com/zaxxer/hikari/AbstractHikariConfig.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java index 33912212..a92e36e5 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/AbstractHikariConfig.java @@ -26,7 +26,6 @@ import java.util.TreeSet; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; -import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; @@ -505,8 +504,7 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean if (metricRegistry instanceof String) { try { InitialContext initCtx = new InitialContext(); - Context envCtx = (Context) initCtx.lookup("java:comp/env"); - metricRegistry = (MetricRegistry) envCtx.lookup((String) metricRegistry); + metricRegistry = (MetricRegistry) initCtx.lookup((String) metricRegistry); } catch (NamingException e) { throw new IllegalArgumentException(e); @@ -542,8 +540,7 @@ public abstract class AbstractHikariConfig implements HikariConfigMBean if (healthCheckRegistry instanceof String) { try { InitialContext initCtx = new InitialContext(); - Context envCtx = (Context) initCtx.lookup("java:comp/env"); - healthCheckRegistry = (MetricRegistry) envCtx.lookup((String) healthCheckRegistry); + healthCheckRegistry = (MetricRegistry) initCtx.lookup((String) healthCheckRegistry); } catch (NamingException e) { throw new IllegalArgumentException(e); From a310df95d71c0e3248efb9322f6a62a19590402d Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Wed, 25 Feb 2015 00:11:54 +0900 Subject: [PATCH 4/4] Fix #269 Guard against drivers that construct an SQLException where the 'cause' is self-referential. Hopefully the cycle is not multi-layers deep, because this check will only guard against one "loop". --- .../src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java b/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java index 1f8fab6d..68318113 100644 --- a/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java +++ b/hikaricp-common/src/main/java/com/zaxxer/hikari/proxy/ConnectionProxy.java @@ -109,7 +109,7 @@ public abstract class ConnectionProxy implements IHikariConnectionProxy LOGGER.warn(String.format("Connection %s (%s) marked as broken because of SQLSTATE(%s), ErrorCode(%d).", delegate.toString(), parentPool.toString(), sqlState, sqle.getErrorCode()), sqle); } - else if (sqle.getNextException() instanceof SQLException) { + else if (sqle.getNextException() instanceof SQLException && sqle != sqle.getNextException()) { checkException(sqle.getNextException()); } }