This is an automated email from the ASF dual-hosted git repository.

jianbin pushed a commit to branch 2.x
in repository https://gitbox.apache.org/repos/asf/incubator-seata.git


The following commit(s) were added to refs/heads/2.x by this push:
     new 8288a5750a bugfix: Resolve MySQL Driver Loading Issue (#6760) (#6765)
8288a5750a is described below

commit 8288a5750acff48c4f7bb9e6a45225095994a823
Author: smartscity <lyl2008...@163.com>
AuthorDate: Sun Aug 25 22:43:19 2024 +0800

    bugfix: Resolve MySQL Driver Loading Issue (#6760) (#6765)
---
 changes/en-us/2.x.md                               |  1 +
 changes/zh-cn/2.x.md                               |  2 +
 .../core/store/db/AbstractDataSourceProvider.java  | 66 +---------------------
 .../store/db/AbstractDataSourceProviderTest.java   |  9 +++
 4 files changed, 13 insertions(+), 65 deletions(-)

diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index b86184a08b..c189f9cc0c 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 d2527d9578..1ccc432ae6 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 2287fcd3b8..9cca970ea6 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<String, ClassLoader> 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 @@ public abstract class AbstractDataSourceProvider 
implements DataSourceProvider,
     }
 
     protected ClassLoader getDriverClassLoader() {
-        return MYSQL_DRIVER_LOADERS.getOrDefault(getDriverClassName(), 
ClassLoader.getSystemClassLoader());
-    }
-
-    private static Map<String, ClassLoader> createMysqlDriverClassLoaders() {
-        Map<String, ClassLoader> 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 1b29b15c4e..a0d8c9f8fe 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 class AbstractDataSourceProviderTest {
         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);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscr...@seata.apache.org
For additional commands, e-mail: notifications-h...@seata.apache.org

Reply via email to