diff --git a/src/main/java/com/zaxxer/hikari/HikariConfig.java b/src/main/java/com/zaxxer/hikari/HikariConfig.java index 3dadf264..c52d18f6 100644 --- a/src/main/java/com/zaxxer/hikari/HikariConfig.java +++ b/src/main/java/com/zaxxer/hikari/HikariConfig.java @@ -46,12 +46,11 @@ public final class HikariConfig implements HikariConfigMBean private String poolName; private String connectionTestQuery; private String dataSourceClassName; + private String shadedCodexMapping; private boolean isJdbc4connectionTest; private boolean isAutoCommit; - - private Properties driverProperties; - private boolean isUseInstrumentation; + private Properties driverProperties; /** * Default constructor @@ -314,6 +313,31 @@ public final class HikariConfig implements HikariConfigMBean this.poolName = poolName; } + public String getShadedCodexMapping() + { + return shadedCodexMapping; + } + + /** + * Set a package mapping for "shaded" drivers so that we can find the DataSource + * in the instrumentation codex even though the package/class name is different. + * The mapping should be of the form:
+ * <original package>:<shaded package> + *
+ * Where the original package name is a widely scoped as possible while still being
+ * unique to the driver. Typically, this is the first two segments of a package
+ * name. For example, take the DataSource org.mariadb.jdbc.MySQLDataSource
,
+ * that has been shaded to com.other.maria.jdbc.MySQLDataSource
. In this case,
+ * the following mapping could be used:
+ * org.mariadb:com.other.maria
+ *
+ * @param mapping a mapping of the form: <original package>:<shaded package>
+ */
+ public void setShadedCodexMapping(String mapping)
+ {
+ this.shadedCodexMapping = mapping;
+ }
+
public void validate()
{
Logger logger = LoggerFactory.getLogger(getClass());
diff --git a/src/main/java/com/zaxxer/hikari/HikariPool.java b/src/main/java/com/zaxxer/hikari/HikariPool.java
index 555e4beb..cab3ac37 100644
--- a/src/main/java/com/zaxxer/hikari/HikariPool.java
+++ b/src/main/java/com/zaxxer/hikari/HikariPool.java
@@ -78,21 +78,23 @@ public final class HikariPool implements HikariPoolMBean
this.jdbc4ConnectionTest = configuration.isJdbc4ConnectionTest();
this.leakDetectionThreshold = configuration.getLeakDetectionThreshold();
+ String dsClassName = configuration.getDataSourceClassName();
try
{
- delegationProxies = !configuration.isUseInstrumentation() || !AgentRegistrationElf.loadTransformerAgent(configuration.getDataSourceClassName());
+ String shadedCodexMapping = configuration.getShadedCodexMapping();
+ delegationProxies = !configuration.isUseInstrumentation() || !AgentRegistrationElf.loadTransformerAgent(dsClassName, shadedCodexMapping);
if (delegationProxies)
{
LOGGER.info("Using Javassist delegate-based proxies.");
}
- Class> clazz = ClassLoaderUtils.loadClass(configuration.getDataSourceClassName());
+ Class> clazz = ClassLoaderUtils.loadClass(dsClassName);
this.dataSource = (DataSource) clazz.newInstance();
PropertyBeanSetter.setTargetFromProperties(dataSource, configuration.getDataSourceProperties());
}
catch (Exception e)
{
- throw new RuntimeException("Could not create datasource class: " + configuration.getDataSourceClassName(), e);
+ throw new RuntimeException("Could not create datasource class: " + dsClassName, e);
}
registerMBean();
diff --git a/src/main/java/com/zaxxer/hikari/javassist/AgentRegistrationElf.java b/src/main/java/com/zaxxer/hikari/javassist/AgentRegistrationElf.java
index 5fb2688b..e61977cb 100644
--- a/src/main/java/com/zaxxer/hikari/javassist/AgentRegistrationElf.java
+++ b/src/main/java/com/zaxxer/hikari/javassist/AgentRegistrationElf.java
@@ -37,7 +37,7 @@ public class AgentRegistrationElf
{
private static final Logger LOGGER = LoggerFactory.getLogger(HikariClassScanner.class);
- public static boolean loadTransformerAgent(String dsClassName)
+ public static boolean loadTransformerAgent(String dsClassName, String shadedCodexMapping)
{
String agentJarPath = getSelfJarPath();
if (agentJarPath == null)
@@ -48,7 +48,6 @@ public class AgentRegistrationElf
try
{
-
Properties systemProperties = System.getProperties();
HikariClassTransformer transformer = new HikariClassTransformer();
@@ -57,7 +56,7 @@ public class AgentRegistrationElf
registerInstrumentation(agentJarPath);
LOGGER.info("Successfully loaded instrumentation agent. Scanning classes...");
- HikariClassScanner scanner = new HikariClassScanner(transformer);
+ HikariClassScanner scanner = new HikariClassScanner(transformer, shadedCodexMapping);
return scanner.scanClasses(dsClassName);
}
catch (Exception e)
@@ -107,6 +106,7 @@ public class AgentRegistrationElf
* dynamically.
*
* @param jarPath the path to our own jar file
+ * @param shadedCodexMapping
* @param dsClassName
* @throws AttachNotSupportedException thrown if the JVM does not support attachment
* @throws IOException thrown if the instrumentation JAR cannot be read
diff --git a/src/main/java/com/zaxxer/hikari/javassist/HikariClassScanner.java b/src/main/java/com/zaxxer/hikari/javassist/HikariClassScanner.java
index f1f8c216..24296c1c 100644
--- a/src/main/java/com/zaxxer/hikari/javassist/HikariClassScanner.java
+++ b/src/main/java/com/zaxxer/hikari/javassist/HikariClassScanner.java
@@ -20,8 +20,10 @@ import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.util.HashMap;
import java.util.HashSet;
-import java.util.Properties;
+import java.util.Map;
+import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -38,14 +40,16 @@ public class HikariClassScanner
private HikariClassTransformer transformer;
- private Properties codex;
+ private Map