diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md index b86184a08be..c189f9cc0c3 100644 --- a/changes/en-us/2.x.md +++ b/changes/en-us/2.x.md @@ -26,6 +26,7 @@ Add changes here for all PR submitted to the 2.x branch. - [[#6757](https://github.com/apache/incubator-seata/pull/6757)] the bug where multiple nodes cannot be retrieved from the naming server - [[#6769](https://github.com/apache/incubator-seata/pull/6769)] fix tcc fence deadLock - [[#6778](https://github.com/apache/incubator-seata/pull/6778)] fix namingserver node term +- [[#6765](https://github.com/apache/incubator-seata/pull/6765)] fix MySQL driver loading by replacing custom classloader with system classloader for better compatibility and simplified process ### optimize: diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md index d2527d9578e..1ccc432ae68 100644 --- a/changes/zh-cn/2.x.md +++ b/changes/zh-cn/2.x.md @@ -27,6 +27,8 @@ - [[#6757](https://github.com/apache/incubator-seata/pull/6757)] 修复client通过namingserver只能获取到一个tc节点的bug - [[#6769](https://github.com/apache/incubator-seata/pull/6769)] 修复tcc fence死锁 - [[#6778](https://github.com/apache/incubator-seata/pull/6778)] 修复namingserver的节点term为0问题 +- [[#6765](https://github.com/apache/incubator-seata/pull/6765)] 改进MySQL驱动加载机制,将自定义类加载器替换为系统类加载器,更兼容简化流程 + ### optimize: - [[#6499](https://github.com/apache/incubator-seata/pull/6499)] 拆分 committing 和 rollbacking 状态的任务线程池 diff --git a/core/src/main/java/org/apache/seata/core/store/db/AbstractDataSourceProvider.java b/core/src/main/java/org/apache/seata/core/store/db/AbstractDataSourceProvider.java index 2287fcd3b85..9cca970ea69 100644 --- a/core/src/main/java/org/apache/seata/core/store/db/AbstractDataSourceProvider.java +++ b/core/src/main/java/org/apache/seata/core/store/db/AbstractDataSourceProvider.java @@ -16,15 +16,6 @@ */ package org.apache.seata.core.store.db; -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLClassLoader; -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.stream.Stream; - import javax.sql.DataSource; import org.apache.seata.common.exception.StoreException; @@ -56,20 +47,8 @@ public abstract class AbstractDataSourceProvider implements DataSourceProvider, */ protected static final Configuration CONFIG = ConfigurationFactory.getInstance(); - private final static String MYSQL_DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver"; - - private final static String MYSQL8_DRIVER_CLASS_NAME = "com.mysql.cj.jdbc.Driver"; - - private final static String MYSQL_DRIVER_FILE_PREFIX = "mysql-connector-java-"; - - private final static Map MYSQL_DRIVER_LOADERS; - private static final long DEFAULT_DB_MAX_WAIT = 5000; - static { - MYSQL_DRIVER_LOADERS = createMysqlDriverClassLoaders(); - } - @Override public void init() { this.dataSource = generate(); @@ -145,50 +124,7 @@ protected Long getMaxWait() { } protected ClassLoader getDriverClassLoader() { - return MYSQL_DRIVER_LOADERS.getOrDefault(getDriverClassName(), ClassLoader.getSystemClassLoader()); - } - - private static Map createMysqlDriverClassLoaders() { - Map loaders = new HashMap<>(); - String cp = System.getProperty("java.class.path"); - if (cp == null || cp.isEmpty()) { - return loaders; - } - Stream.of(cp.split(File.pathSeparator)) - .map(File::new) - .filter(File::exists) - .map(file -> file.isFile() ? file.getParentFile() : file) - .filter(Objects::nonNull) - .filter(File::isDirectory) - .map(file -> new File(file, "jdbc")) - .filter(File::exists) - .filter(File::isDirectory) - .distinct() - .flatMap(file -> { - File[] files = file.listFiles((f, name) -> name.startsWith(MYSQL_DRIVER_FILE_PREFIX)); - if (files != null) { - return Stream.of(files); - } else { - return Stream.of(); - } - }) - .forEach(file -> { - if (loaders.containsKey(MYSQL8_DRIVER_CLASS_NAME) && loaders.containsKey(MYSQL_DRIVER_CLASS_NAME)) { - return; - } - try { - URL url = file.toURI().toURL(); - ClassLoader loader = new URLClassLoader(new URL[]{url}, ClassLoader.getSystemClassLoader()); - try { - loader.loadClass(MYSQL8_DRIVER_CLASS_NAME); - loaders.putIfAbsent(MYSQL8_DRIVER_CLASS_NAME, loader); - } catch (ClassNotFoundException e) { - loaders.putIfAbsent(MYSQL_DRIVER_CLASS_NAME, loader); - } - } catch (MalformedURLException ignore) { - } - }); - return loaders; + return ClassLoader.getSystemClassLoader(); } /** diff --git a/server/src/test/java/org/apache/seata/server/store/db/AbstractDataSourceProviderTest.java b/server/src/test/java/org/apache/seata/server/store/db/AbstractDataSourceProviderTest.java index 1b29b15c4e3..a0d8c9f8fe9 100644 --- a/server/src/test/java/org/apache/seata/server/store/db/AbstractDataSourceProviderTest.java +++ b/server/src/test/java/org/apache/seata/server/store/db/AbstractDataSourceProviderTest.java @@ -35,6 +35,8 @@ public class AbstractDataSourceProviderTest { private final String hikariDatasourceType = "hikari"; + private final String mysqlJdbcDriver = "com.mysql.jdbc.Driver"; + @Test public void testDbcpDataSourceProvider() { DataSource dataSource = EnhancedServiceLoader.load(DataSourceProvider.class, dbcpDatasourceType).provide(); @@ -52,4 +54,11 @@ public void testHikariDataSourceProvider() { DataSource dataSource = EnhancedServiceLoader.load(DataSourceProvider.class, hikariDatasourceType).provide(); Assertions.assertNotNull(dataSource); } + + @Test + public void testMySQLDataSourceProvider() throws ClassNotFoundException { + ClassLoader classLoader = ClassLoader.getSystemClassLoader(); + Class driverClass = Class.forName(mysqlJdbcDriver, true, classLoader); + Assertions.assertNotNull(driverClass); + } }