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 11d09edfec optimize: add support for DM Database in XAUtils class 
(#7551)
11d09edfec is described below

commit 11d09edfec12dd6edd036b0d836af62feb37db50
Author: wangyjay <[email protected]>
AuthorDate: Mon Sep 1 13:44:38 2025 +0800

    optimize: add support for DM Database in XAUtils class (#7551)
---
 changes/en-us/2.x.md                               |   2 +-
 changes/zh-cn/2.x.md                               |   1 +
 .../apache/seata/rm/datasource/util/XAUtils.java   |  10 ++
 .../seata/rm/datasource/util/XAUtilsTest.java      | 115 +++++++++++++++++++++
 4 files changed, 127 insertions(+), 1 deletion(-)

diff --git a/changes/en-us/2.x.md b/changes/en-us/2.x.md
index 4d92f4269e..941bf2302e 100644
--- a/changes/en-us/2.x.md
+++ b/changes/en-us/2.x.md
@@ -23,7 +23,7 @@ Add changes here for all PR submitted to the 2.x branch.
 - [[#7485](https://github.com/apache/incubator-seata/pull/7485)] Add http 
request filter for seata-server
 - [[#7509](https://github.com/apache/incubator-seata/pull/7509)] Reuse 
connection to merge branch transactions
 - [[#7492](https://github.com/apache/incubator-seata/pull/7492)] upgrade HTTP 
client in common module to support HTTP/2
-
+  [[#7551](https://github.com/apache/incubator-seata/pull/7551)] XAUtils add 
support for DM Database
 
 ### bugfix:
 
diff --git a/changes/zh-cn/2.x.md b/changes/zh-cn/2.x.md
index 4e88d4209f..7102d8b9ec 100644
--- a/changes/zh-cn/2.x.md
+++ b/changes/zh-cn/2.x.md
@@ -23,6 +23,7 @@
 - [[#7485](https://github.com/apache/incubator-seata/pull/7485)] 
给seata-server端的http请求添加过滤器
 - [[#7509](https://github.com/apache/incubator-seata/pull/7509)] 复用连接合并分支事务
 - [[#7492](https://github.com/apache/incubator-seata/pull/7492)] 升级 common 
模块中的 HTTP 客户端以支持 HTTP/2
+- [[#7551](https://github.com/apache/incubator-seata/pull/7551)] XAUtils支持达梦数据库
 
 
 ### bugfix:
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 9a3a775bca..9eaac69bff 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
@@ -70,6 +70,8 @@ public class XAUtils {
                         return PGUtils.createXAConnection(physicalConn);
                     case JdbcConstants.KINGBASE:
                         return createXAConnection(physicalConn, 
"com.kingbase8.xa.KBXAConnection", dbType);
+                    case JdbcConstants.DM:
+                        return createXAConnection(physicalConn, 
"dm.jdbc.driver.DmdbXAConnection", dbType);
                     default:
                         throw new SQLException("xa not support dbType: " + 
dbType);
                 }
@@ -114,6 +116,8 @@ public class XAUtils {
                 case JdbcConstants.KINGBASE:
                     Class<?> kingbaseConnectionClass = 
Class.forName("com.kingbase8.core.BaseConnection");
                     return 
xaConnectionClass.getConstructor(kingbaseConnectionClass);
+                case JdbcConstants.DM:
+                    return xaConnectionClass.getConstructor(Connection.class);
                 default:
                     throw new SQLException("xa reflect not support dbType: " + 
dbType);
             }
@@ -146,6 +150,12 @@ public class XAUtils {
                         result.add(mariaDbConnectionInstance);
                         return result;
                     }
+                case JdbcConstants.DM:
+                    Class<?> dmConnectionClass = 
Class.forName("dm.jdbc.driver.DmdbConnection");
+                    if (dmConnectionClass.isInstance(params[0])) {
+                        result.add(dmConnectionClass.cast(params[0]));
+                        return (List<T>) result;
+                    }
                 default:
                     throw new SQLException("xa reflect not support dbType: " + 
dbType);
             }
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
new file mode 100644
index 0000000000..963aa5d601
--- /dev/null
+++ 
b/rm-datasource/src/test/java/org/apache/seata/rm/datasource/util/XAUtilsTest.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.seata.rm.datasource.util;
+
+import com.alibaba.druid.util.MySqlUtils;
+import com.alibaba.druid.util.PGUtils;
+import org.apache.seata.rm.BaseDataSourceResource;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.MockedConstruction;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import javax.sql.XAConnection;
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.SQLException;
+
+import static org.apache.seata.sqlparser.util.JdbcConstants.*;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+@ExtendWith(MockitoExtension.class)
+public class XAUtilsTest {
+    private Connection mockConnection;
+    private Driver mockDriver;
+    private BaseDataSourceResource mockDataSourceResource;
+
+    @BeforeEach
+    public void setUp() {
+        mockConnection = mock(Connection.class);
+        mockDriver = mock(Driver.class);
+        mockDataSourceResource = mock(BaseDataSourceResource.class);
+        when(mockDataSourceResource.getDriver()).thenReturn(mockDriver);
+    }
+
+    @Test
+    public void testCreateXAConnectionMySQL() throws SQLException {
+        when(mockDataSourceResource.getDbType()).thenReturn(MYSQL);
+        XAConnection mockXAConnection = mock(XAConnection.class);
+
+        try (MockedStatic<MySqlUtils> mySqlUtilsMock = 
Mockito.mockStatic(MySqlUtils.class)) {
+            mySqlUtilsMock
+                    .when(() -> MySqlUtils.createXAConnection(any(), any()))
+                    .thenReturn(mockXAConnection);
+            XAConnection result = XAUtils.createXAConnection(mockConnection, 
mockDataSourceResource);
+            assertSame(mockXAConnection, result);
+        }
+    }
+
+    @Test
+    public void testCreateXAConnectionPostgreSQL() throws SQLException, 
ClassNotFoundException {
+        when(mockDataSourceResource.getDbType()).thenReturn(POSTGRESQL);
+        XAConnection mockXAConnection = mock(XAConnection.class);
+        try (MockedStatic<PGUtils> pgUtilsMock = 
Mockito.mockStatic(PGUtils.class)) {
+            pgUtilsMock.when(() -> 
PGUtils.createXAConnection(any())).thenReturn(mockXAConnection);
+            XAConnection result = XAUtils.createXAConnection(mockConnection, 
mockDataSourceResource);
+            assertSame(mockXAConnection, result);
+        }
+    }
+
+    private void testCreateXAConnectionForDbType(String dbType, String 
connectionClass, String xaConnectionClass) {
+        try {
+            when(mockDataSourceResource.getDbType()).thenReturn(dbType);
+
+            Connection specificConn = 
mock(Class.forName(connectionClass).asSubclass(Connection.class));
+
+            try (MockedConstruction<?> xaConstruction = mockConstruction(
+                    
Class.forName(xaConnectionClass).asSubclass(XAConnection.class), (mock, 
context) -> {
+                        Connection param = (Connection) 
context.arguments().get(0);
+                        assertSame(specificConn, param);
+                    })) {
+
+                XAConnection result = XAUtils.createXAConnection(specificConn, 
mockDataSourceResource);
+                assertNotNull(result);
+            }
+        } catch (Exception e) {
+            fail(dbType + " test failed: " + e.getMessage());
+        }
+    }
+
+    @Test
+    public void testCreateXAConnectionMariaDB() throws SQLException, 
ClassNotFoundException {
+        testCreateXAConnectionForDbType(
+                MARIADB, "org.mariadb.jdbc.MariaDbConnection", 
"org.mariadb.jdbc.MariaXaConnection");
+    }
+
+    @Test
+    public void testCreateXAConnectionKingbase() throws SQLException, 
ClassNotFoundException {
+        testCreateXAConnectionForDbType(
+                KINGBASE, "com.kingbase8.core.BaseConnection", 
"com.kingbase8.xa.KBXAConnection");
+    }
+
+    @Test
+    public void testCreateXAConnectionDM() throws SQLException, 
ClassNotFoundException {
+        testCreateXAConnectionForDbType(DM, "dm.jdbc.driver.DmdbConnection", 
"dm.jdbc.driver.DmdbXAConnection");
+    }
+}


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

Reply via email to