From ad3f9eaa55b2daf68c908bcb8d2201be7ff489f6 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Wed, 19 Nov 2014 22:42:28 +0900 Subject: [PATCH] Go ahead and implement double-checked locking, this is a low traffic method. --- .../com/zaxxer/hikari/util/PoolUtilities.java | 39 +++++++++++-------- .../com/zaxxer/hikari/util/PoolUtilities.java | 27 ++++++++----- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java b/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java index 974d2d4c..ce71b4c0 100644 --- a/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java +++ b/hikaricp-java6/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java @@ -233,22 +233,29 @@ public final class PoolUtilities */ public static boolean isJdbc40Compliant(final Connection connection) throws SQLException { - if (!jdbc40checked) { - try { - connection.isValid(5); // This will throw AbstractMethodError or SQLException in the case of a non-JDBC 41 compliant driver - IS_JDBC40 = true; - } - catch (SQLFeatureNotSupportedException e) { - IS_JDBC40 = false; - } - catch (AbstractMethodError e) { - IS_JDBC40 = false; - } - catch (NoSuchMethodError e) { - IS_JDBC40 = false; - } - finally { - jdbc40checked = true; + // See http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java + boolean checked = jdbc40checked; + if (!checked) { + synchronized (PoolUtilities.class) { + checked = jdbc40checked; + if (!checked) { + try { + connection.isValid(5); // This will throw AbstractMethodError or SQLException in the case of a non-JDBC 41 compliant driver + IS_JDBC40 = true; + } + catch (SQLFeatureNotSupportedException e) { + IS_JDBC40 = false; + } + catch (AbstractMethodError e) { + IS_JDBC40 = false; + } + catch (NoSuchMethodError e) { + IS_JDBC40 = false; + } + finally { + jdbc40checked = checked = true; + } + } } } diff --git a/hikaricp/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java b/hikaricp/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java index 6a6c81fc..21e7e28b 100644 --- a/hikaricp/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java +++ b/hikaricp/src/main/java/com/zaxxer/hikari/util/PoolUtilities.java @@ -215,16 +215,23 @@ public final class PoolUtilities */ public static boolean isJdbc40Compliant(final Connection connection) throws SQLException { - if (!jdbc40checked) { - try { - connection.isValid(5); // This will throw AbstractMethodError or SQLException in the case of a non-JDBC 41 compliant driver - IS_JDBC40 = true; - } - catch (NoSuchMethodError | AbstractMethodError | SQLFeatureNotSupportedException e) { - IS_JDBC40 = false; - } - finally { - jdbc40checked = true; + // See http://en.wikipedia.org/wiki/Double-checked_locking#Usage_in_Java + boolean checked = jdbc40checked; + if (!checked) { + synchronized (PoolUtilities.class) { + checked = jdbc40checked; + if (!checked) { + try { + connection.isValid(5); // This will throw AbstractMethodError or SQLException in the case of a non-JDBC 41 compliant driver + IS_JDBC40 = true; + } + catch (NoSuchMethodError | AbstractMethodError | SQLFeatureNotSupportedException e) { + IS_JDBC40 = false; + } + finally { + jdbc40checked = checked = true; + } + } } }