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

jimin 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 32119ea1ac optimize: support mariadb 3.x (#7807)
32119ea1ac is described below

commit 32119ea1ac51d1116535844c1a83c03f7c5aca25
Author: lokidundun <[email protected]>
AuthorDate: Sat Dec 6 23:35:14 2025 +0800

    optimize: support mariadb 3.x (#7807)
---
 changes/en-us/2.x.md                               |  1 +
 changes/zh-cn/2.x.md                               |  1 +
 .../apache/seata/rm/datasource/util/XAUtils.java   | 27 ++++++++++++++--------
 .../seata/rm/datasource/util/XAUtilsTest.java      | 17 ++++++++++++++
 4 files changed, 36 insertions(+), 10 deletions(-)

diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index 7330594eb8..6ba81c7221 100644
--- a/changes/en-us/2.x.md
+++ b/changes/en-us/2.x.md
@@ -77,6 +77,7 @@ Add changes here for all PR submitted to the 2.x branch.
 - [[#7741](https://github.com/apache/incubator-seata/pull/7741)] supports 
publishing image based on JDK 25
 - [[#7743](https://github.com/seata/seata/pull/7743)] upgrade Apache Tomcat 
dependency from 9.0.108 to 9.0.109
 - [[#7740](https://github.com/apache/incubator-seata/pull/7740)] enhance 
HttpClient to support h2c
+- [[#7807](https://github.com/apache/incubator-seata/pull/7807)] support 
mariadb 3.x
 - [[#7781](https://github.com/apache/incubator-seata/pull/7781)] highlight 
pmd-check log
 - [[#7813](https://github.com/apache/incubator-seata/pull/7813)] add decode 
buffer limit
 - [[#7829](https://github.com/apache/incubator-seata/pull/7829)] optimize lz4 
compressor
diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md
index 8b7761e8f6..564f560a56 100644
--- a/changes/zh-cn/2.x.md
+++ b/changes/zh-cn/2.x.md
@@ -76,6 +76,7 @@
 - [[#7741](https://github.com/apache/incubator-seata/pull/7741)] 支持发布基于JDK 
25的镜像
 - [[#7743](https://github.com/seata/seata/pull/7743)] 将 Apache Tomcat 依赖项从 
9.0.108 升级到 9.0.109
 - [[#7740](https://github.com/apache/incubator-seata/pull/7740)] 
优化http工具类使之支持h2c协议
+- [[#7807](https://github.com/apache/incubator-seata/pull/7807)] 支持 mariadb 3.x
 - [[#7781](https://github.com/apache/incubator-seata/pull/7781)] 高亮 pmd 检查日志信息
 - [[#7813](https://github.com/apache/incubator-seata/pull/7813)] 增加解码buffer限制
 - [[#7829](https://github.com/apache/incubator-seata/pull/7829)] 优化lz4 
compressor
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 f851600625..e6484dfdfc 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
@@ -38,6 +38,9 @@ public class XAUtils {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(XAUtils.class);
 
+    private static final String MARIADB_3X_XA_CONNECTION_CLASS = 
"org.mariadb.jdbc.MariaDbPooledConnection";
+    private static final String MARIADB_PRE3X_XA_CONNECTION_CLASS = 
"org.mariadb.jdbc.MariaXaConnection";
+
     public static String getDbType(String jdbcUrl, String driverClassName) {
         return JdbcUtils.getDbType(jdbcUrl, driverClassName);
     }
@@ -65,7 +68,12 @@ public class XAUtils {
                             return createXAConnection(physicalConn, 
"oracle.jdbc.xa.client.OracleXAConnection", dbType);
                         }
                     case JdbcConstants.MARIADB:
-                        return createXAConnection(physicalConn, 
"org.mariadb.jdbc.MariaXaConnection", dbType);
+                        try {
+                            return createXAConnection(physicalConn, 
MARIADB_3X_XA_CONNECTION_CLASS, dbType);
+                        } catch (Exception e) {
+                            LOGGER.warn("Failed to create MariaDB 3.x XA 
Connection, try pre-3.x version", e);
+                            return createXAConnection(physicalConn, 
MARIADB_PRE3X_XA_CONNECTION_CLASS, dbType);
+                        }
                     case JdbcConstants.POSTGRESQL:
                         return PGUtils.createXAConnection(physicalConn);
                     case JdbcConstants.KINGBASE:
@@ -112,9 +120,12 @@ public class XAUtils {
                 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);
+                    if 
("org.mariadb.jdbc.MariaXaConnection".equals(xaConnectionClass.getName())) {
+                        Class<?> mariaDbConnectionClass = 
Class.forName("org.mariadb.jdbc.MariaDbConnection");
+                        return 
xaConnectionClass.getConstructor(mariaDbConnectionClass);
+                    } else {
+                        return 
xaConnectionClass.getConstructor(Connection.class);
+                    }
                 case JdbcConstants.KINGBASE:
                     Class<?> kingbaseConnectionClass = 
Class.forName("com.kingbase8.core.BaseConnection");
                     return 
xaConnectionClass.getConstructor(kingbaseConnectionClass);
@@ -151,12 +162,8 @@ public class XAUtils {
                     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;
-                    }
+                    result.add(params[0]);
+                    return (List<T>) result;
                 case JdbcConstants.DM:
                     Class<?> dmConnectionClass = 
Class.forName("dm.jdbc.driver.DmdbConnection");
                     if (dmConnectionClass.isInstance(params[0])) {
diff --git 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/util/XAUtilsTest.java
 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/util/XAUtilsTest.java
index 8bf3e489c0..049770bee3 100644
--- 
a/rm-datasource/src/test/java/org/apache/seata/rm/datasource/util/XAUtilsTest.java
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/util/XAUtilsTest.java
@@ -117,4 +117,21 @@ public class XAUtilsTest {
     public void testCreateXAConnectionOscar() throws SQLException, 
ClassNotFoundException {
         testCreateXAConnectionForDbType(OSCAR, 
"com.oscar.jdbc.OscarJdbc2Connection", "com.oscar.xa.Jdbc3XAConnection");
     }
+
+    @Test
+    public void testCreateXAConnectionConstructorNotFound() {
+        
when(mockDataSourceResource.getDbType()).thenReturn("unsupportedDbType");
+        assertThrows(SQLException.class, () -> {
+            XAUtils.createXAConnection(mockConnection, mockDataSourceResource);
+        });
+    }
+
+    @Test
+    public void testCreateXAConnectionConstructorMismatch() throws Exception {
+        when(mockDataSourceResource.getDbType()).thenReturn(KINGBASE);
+        Connection wrongConn = mock(Connection.class);
+        assertThrows(SQLException.class, () -> {
+            XAUtils.createXAConnection(wrongConn, mockDataSourceResource);
+        });
+    }
 }


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

Reply via email to