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]