diff --git a/README.md b/README.md index 6d53c55..67d2049 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ 启用该插件以后,需要在WEB-INF目录下新建一个driverlib文件夹,将对应的驱动jar包放入这个文件夹内即可 - 注意:使用了隔离插件以后驱动jar包不需要放在lib目录下 + 注意A:使用了隔离插件以后驱动jar包不需要放在lib目录下 + 注意B:HIVE驱动依赖于slf4j的jar,同样需要放入dirverlib文件夹中 目前该插件默认是隔离MySQL的驱动,如果是其他数据源,只需要修改DRIVER_NAME_KEY为对应的驱动即可 diff --git a/plugin.xml b/plugin.xml index 47b2560..47fbff1 100644 --- a/plugin.xml +++ b/plugin.xml @@ -12,6 +12,7 @@ [2019-05-20]优化逻辑。
[2019-05-30]实现一个可用的ClassLoader。
[2019-05-31]修改Mysql的key为Hive。
+ [2019-05-31]考虑一下并发问题,针对hive修改了一下加载机制。
]]> com.fr.plugin.dialect.classloader diff --git a/src/main/java/com/fr/plugin/dialect/classloader/ClassLoaderHandler.java b/src/main/java/com/fr/plugin/dialect/classloader/ClassLoaderHandler.java index fd02b5d..736311f 100644 --- a/src/main/java/com/fr/plugin/dialect/classloader/ClassLoaderHandler.java +++ b/src/main/java/com/fr/plugin/dialect/classloader/ClassLoaderHandler.java @@ -20,10 +20,11 @@ import java.util.List; @EnableMetrics public class ClassLoaderHandler extends AbstractDataSourceDriverLoader { + private ClassLoader driverClassLoader; //插件获取jar的路径,和lib同级的driverlib目录 public static final String DRIVER_LIB_DIR = "driverlib"; - //demo设置为mysql为目标驱动 + //demo设置为hive为目标驱动 private static final String DRIVER_NAME_KEY = "org.apache.hive.jdbc.HiveDriver"; @Focus(id = "com.fr.plugin.dialect.classloader.ClassLoaderHandler", text = "", source = Original.PLUGIN) @@ -41,11 +42,14 @@ public class ClassLoaderHandler extends AbstractDataSourceDriverLoader { @Focus(id = "com.fr.plugin.dialect.classloader.ClassLoaderHandler", text = "", source = Original.PLUGIN) public ClassLoader getClassLoader() { - FineLoggerFactory.getLogger().info("====== Loading Mysql ClassLoader ... ======"); - URL[] urls = getJarURLS(); - ClassLoader cl = new DriverClassLoader(urls); - Thread.currentThread().setContextClassLoader(cl); - return cl; + FineLoggerFactory.getLogger().info("====== Loading Hive ClassLoader ... ======"); + synchronized (this) { + if (this.driverClassLoader == null) { + URL[] urls = getJarURLS(); + this.driverClassLoader = new DriverClassLoader(urls); + } + return driverClassLoader; + } } diff --git a/src/main/java/com/fr/plugin/dialect/classloader/DriverClassLoader.java b/src/main/java/com/fr/plugin/dialect/classloader/DriverClassLoader.java index 6f80d96..50f6aeb 100644 --- a/src/main/java/com/fr/plugin/dialect/classloader/DriverClassLoader.java +++ b/src/main/java/com/fr/plugin/dialect/classloader/DriverClassLoader.java @@ -33,8 +33,8 @@ public class DriverClassLoader extends URLClassLoader { FineLoggerFactory.getLogger().debug("Did not find class{}, in the paths {}, try to get from common lib", name, this.getUrlStrings()); c = super.loadClass(name); } - return c; + } }