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

xingfudeshi 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 c3da4d85b1 optimize: remove mariadb API (#6330)
c3da4d85b1 is described below

commit c3da4d85b1c181b10570dbfdd1d98afb952decbd
Author: jimin <[email protected]>
AuthorDate: Mon Feb 5 15:18:43 2024 +0800

    optimize: remove mariadb API (#6330)
---
 changes/en-us/2.x.md                               |   1 +
 changes/zh-cn/2.x.md                               |   1 +
 rm-datasource/pom.xml                              |   3 +-
 .../apache/seata/rm/datasource/util/XAUtils.java   | 100 ++++++++++++++++-----
 .../apache/seata/rm/xa/DataSourceProxyXATest.java  |  29 +++---
 5 files changed, 96 insertions(+), 38 deletions(-)

diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index 2b58692718..ee15b98e0c 100644
--- a/changes/en-us/2.x.md
+++ b/changes/en-us/2.x.md
@@ -81,6 +81,7 @@ Add changes here for all PR submitted to the 2.x branch.
 - [[#6301](https://github.com/apache/incubator-seata/pull/6301)] upgrade 
console frontend dependencies and supported nodejs versions
 - [[#6301](https://github.com/apache/incubator-seata/pull/6312)] add saga 
related io.seata compatible api
 - [[#6313](https://github.com/apache/incubator-seata/pull/6313)] console 
display the version number
+- [[#6330](https://github.com/apache/incubator-seata/pull/6330)] remove 
mariadb API
 - [[#6329](https://github.com/apache/incubator-seata/pull/6312)] add saga 
subcomponent-level io.seata compatible api
 - [[#6254](https://github.com/apache/incubator-seata/pull/6254)] optimize 
Hessian Serialize
 
diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md
index c9711e2f20..22a26766a9 100644
--- a/changes/zh-cn/2.x.md
+++ b/changes/zh-cn/2.x.md
@@ -79,6 +79,7 @@
 - [[#6301](https://github.com/apache/incubator-seata/pull/6301)] 
升级console前端依赖及支持的nodejs版本
 - [[#6301](https://github.com/apache/incubator-seata/pull/6312)] 
添加saga相关的io.seata兼容性API
 - [[#6313](https://github.com/apache/incubator-seata/pull/6313)] console展示版本号
+- [[#6330](https://github.com/apache/incubator-seata/pull/6330)] 去除 mariadb API
 - [[#6329](https://github.com/apache/incubator-seata/pull/6312)] 
添加saga子组件的io.seata兼容性API
 - [[#6254](https://github.com/apache/incubator-seata/pull/6254)] 优化Hessian 序列化
 
diff --git a/rm-datasource/pom.xml b/rm-datasource/pom.xml
index 5318ac1544..93f3c5a9e9 100644
--- a/rm-datasource/pom.xml
+++ b/rm-datasource/pom.xml
@@ -125,8 +125,7 @@
         <dependency>
             <groupId>org.mariadb.jdbc</groupId>
             <artifactId>mariadb-java-client</artifactId>
-            <scope>provided</scope>
-            <optional>true</optional>
+            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>commons-logging</groupId>
diff --git 
a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/util/XAUtils.java 
b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/util/XAUtils.java
index d1c8c12bef..1d79407a14 100644
--- 
a/rm-datasource/src/main/java/org/apache/seata/rm/datasource/util/XAUtils.java
+++ 
b/rm-datasource/src/main/java/org/apache/seata/rm/datasource/util/XAUtils.java
@@ -20,15 +20,19 @@ import java.lang.reflect.Constructor;
 import java.sql.Connection;
 import java.sql.Driver;
 import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
 import javax.sql.XAConnection;
 import javax.transaction.xa.XAException;
+
 import com.alibaba.druid.util.JdbcUtils;
 import com.alibaba.druid.util.MySqlUtils;
 import com.alibaba.druid.util.PGUtils;
+
 import org.apache.seata.rm.BaseDataSourceResource;
 import org.apache.seata.sqlparser.util.JdbcConstants;
-import org.mariadb.jdbc.MariaDbConnection;
-import org.mariadb.jdbc.MariaXaConnection;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,49 +48,101 @@ public class XAUtils {
         return createXAConnection(physicalConn, 
dataSourceResource.getDriver(), dataSourceResource.getDbType());
     }
 
-    public static XAConnection createXAConnection(Connection physicalConn, 
Driver driver, String dbType) throws SQLException {
+    public static XAConnection createXAConnection(Connection physicalConn, 
Driver driver, String dbType)
+        throws SQLException {
         if (JdbcConstants.MYSQL.equals(dbType)) {
             return MySqlUtils.createXAConnection(driver, physicalConn);
         } else {
-            switch (dbType) {
-                case JdbcConstants.ORACLE:
-                    try {
+            try {
+                switch (dbType) {
+                    case JdbcConstants.ORACLE:
                         // https://github.com/alibaba/druid/issues/3707
                         // before Druid issue fixed, just make ORACLE XA 
connection in my way.
                         // return OracleUtils.OracleXAConnection(physicalConn);
                         String physicalConnClassName = 
physicalConn.getClass().getName();
                         if 
("oracle.jdbc.driver.T4CConnection".equals(physicalConnClassName)) {
-                            return createOracleXAConnection(physicalConn, 
"oracle.jdbc.driver.T4CXAConnection");
+                            return createXAConnection(physicalConn, 
"oracle.jdbc.driver.T4CXAConnection", dbType);
                         } else {
-                            return createOracleXAConnection(physicalConn, 
"oracle.jdbc.xa.client.OracleXAConnection");
+                            return createXAConnection(physicalConn, 
"oracle.jdbc.xa.client.OracleXAConnection", dbType);
                         }
-                    } catch (XAException xae) {
-                        throw new SQLException("create xaConnection error", 
xae);
-                    }
-                case JdbcConstants.MARIADB:
-                    return new 
MariaXaConnection((MariaDbConnection)physicalConn);
-                case JdbcConstants.POSTGRESQL:
-                    return PGUtils.createXAConnection(physicalConn);
-                default:
-                    throw new SQLException("xa not support dbType: " + dbType);
+                    case JdbcConstants.MARIADB:
+                        return createXAConnection(physicalConn, 
"org.mariadb.jdbc.MariaXaConnection", dbType);
+                    case JdbcConstants.POSTGRESQL:
+                        return PGUtils.createXAConnection(physicalConn);
+                    default:
+                        throw new SQLException("xa not support dbType: " + 
dbType);
+                }
+            } catch (Exception xae) {
+                throw new SQLException("create xaConnection error", xae);
             }
         }
     }
 
-    private static XAConnection createOracleXAConnection(Connection 
physicalConnection, String xaConnectionClassName) throws XAException, 
SQLException {
+    private static XAConnection createXAConnection(Connection 
physicalConnection, String xaConnectionClassName,
+                                                   String dbType) throws 
XAException, SQLException {
         try {
             Class xaConnectionClass = Class.forName(xaConnectionClassName);
-            Constructor<XAConnection> constructor = 
xaConnectionClass.getConstructor(Connection.class);
+            Constructor<XAConnection> constructor = 
getConstructorByDBType(xaConnectionClass, dbType);
+            if (constructor == null) {
+                throw new SQLException("xa not support dbType: " + dbType);
+            }
             constructor.setAccessible(true);
-            return constructor.newInstance(physicalConnection);
+            List<Object> params = getInitargsByDBType(dbType, 
physicalConnection);
+            return constructor.newInstance(params.toArray(new Object[0]));
         } catch (Exception e) {
-            LOGGER.warn("Failed to create Oracle XA Connection " + 
xaConnectionClassName + " on " + physicalConnection);
+            LOGGER.warn("Failed to create XA Connection " + 
xaConnectionClassName + " on " + physicalConnection);
             if (e instanceof XAException) {
-                throw (XAException) e;
+                throw (XAException)e;
             } else {
                 throw new SQLException(e);
             }
         }
 
     }
+
+    private static Constructor<XAConnection> getConstructorByDBType(Class 
xaConnectionClass, String dbType) throws SQLException {
+        try {
+            switch (dbType) {
+                case JdbcConstants.ORACLE:
+                    return xaConnectionClass.getConstructor(Connection.class);
+                case JdbcConstants.MARIADB:
+                    //MariaXaConnection(MariaDbConnection connection)
+                    Class mariaXaConnectionClass = 
Class.forName("org.mariadb.jdbc.MariaDbConnection");
+                    return 
xaConnectionClass.getConstructor(mariaXaConnectionClass);
+                default:
+                    throw new SQLException("xa reflect not support dbType: " + 
dbType);
+            }
+        } catch (Exception e) {
+            throw new SQLException(e);
+        }
+    }
+
+    private static <T> List<T> getInitargsByDBType(String dbType, Object... 
params) throws SQLException {
+        List result = new ArrayList<>();
+        if (params.length == 0) {
+            return null;
+        }
+        if (!(params[0] instanceof Connection)) {
+            throw new SQLException("not support params: " + 
Arrays.toString(params));
+        }
+
+        try {
+            switch (dbType) {
+                case JdbcConstants.ORACLE:
+                    result.add(params[0]);
+                    return result;
+                case JdbcConstants.MARIADB:
+                    Class mariaDbConnectionClass = 
Class.forName("org.mariadb.jdbc.MariaDbConnection");
+                    if (mariaDbConnectionClass.isInstance(params[0])) {
+                        Object mariaDbConnectionInstance = 
mariaDbConnectionClass.cast(params[0]);
+                        result.add(mariaDbConnectionInstance);
+                        return result;
+                    }
+                default:
+                    throw new SQLException("xa reflect not support dbType: " + 
dbType);
+            }
+        } catch (Exception e) {
+            throw new SQLException(e);
+        }
+    }
 }
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/xa/DataSourceProxyXATest.java 
b/rm-datasource/src/test/java/org/apache/seata/rm/xa/DataSourceProxyXATest.java
index 6f9f0ed371..d72210e5e5 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/xa/DataSourceProxyXATest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/xa/DataSourceProxyXATest.java
@@ -16,7 +16,17 @@
  */
 package org.apache.seata.rm.xa;
 
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.Driver;
+import java.sql.SQLException;
+
+import javax.sql.DataSource;
+import javax.sql.PooledConnection;
+import javax.sql.XAConnection;
+
 import com.alibaba.druid.pool.DruidDataSource;
+
 import com.mysql.jdbc.JDBC4MySQLConnection;
 import com.mysql.jdbc.jdbc2.optional.JDBC4ConnectionWrapper;
 import org.apache.seata.core.context.RootContext;
@@ -26,22 +36,12 @@ import org.apache.seata.rm.datasource.xa.DataSourceProxyXA;
 import org.junit.jupiter.api.AfterAll;
 import org.junit.jupiter.api.Assertions;
 import org.junit.jupiter.api.Test;
-import org.mariadb.jdbc.MariaDbConnection;
 import org.mockito.Mockito;
 
-import javax.sql.DataSource;
-import javax.sql.PooledConnection;
-import javax.sql.XAConnection;
-import java.sql.Connection;
-import java.sql.DatabaseMetaData;
-import java.sql.Driver;
-import java.sql.SQLException;
-
 import static org.mockito.ArgumentMatchers.any;
 
 /**
  * Tests for DataSourceProxyXA
- *
  */
 public class DataSourceProxyXATest {
 
@@ -91,10 +91,11 @@ public class DataSourceProxyXATest {
     }
 
     @Test
-    public void testGetMariaXaConnection() throws SQLException {
+    public void testGetMariaXaConnection() throws SQLException, 
ClassNotFoundException {
         // Mock
         Driver driver = Mockito.mock(Driver.class);
-        MariaDbConnection connection = Mockito.mock(MariaDbConnection.class);
+        Class clazz = Class.forName("org.mariadb.jdbc.MariaDbConnection");
+        Connection connection = (Connection)(Mockito.mock(clazz));
         Mockito.when(connection.getAutoCommit()).thenReturn(true);
         DatabaseMetaData metaData = Mockito.mock(DatabaseMetaData.class);
         Mockito.when(metaData.getURL()).thenReturn("jdbc:mariadb:xxx");
@@ -120,12 +121,12 @@ public class DataSourceProxyXATest {
 
         XAConnection xaConnection = connectionProxyXA.getWrappedXAConnection();
         Connection connectionInXA = xaConnection.getConnection();
-        Assertions.assertTrue(connectionInXA instanceof MariaDbConnection);
+        Assertions.assertEquals("org.mariadb.jdbc.MariaDbConnection", 
connectionInXA.getClass().getName());
         tearDown();
     }
 
     @AfterAll
-    public static void tearDown(){
+    public static void tearDown() {
         RootContext.unbind();
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to