From f0da0a9dc174b010ae1386acce85b4b5c159c63c Mon Sep 17 00:00:00 2001 From: fengshuonan Date: Thu, 14 Oct 2021 15:21:43 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=907.1.5=E3=80=91=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AF=B9XA=E6=95=B0=E6=8D=AE=E6=BA=90=E7=9A=84=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../db/mp/dbid/CustomDatabaseIdProvider.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/dbid/CustomDatabaseIdProvider.java b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/dbid/CustomDatabaseIdProvider.java index 30d7be3c9..8410bd2ff 100644 --- a/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/dbid/CustomDatabaseIdProvider.java +++ b/kernel-d-db/db-sdk-mp/src/main/java/cn/stylefeng/roses/kernel/db/mp/dbid/CustomDatabaseIdProvider.java @@ -25,9 +25,11 @@ package cn.stylefeng.roses.kernel.db.mp.dbid; import cn.stylefeng.roses.kernel.db.api.enums.DbTypeEnum; +import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.mapping.DatabaseIdProvider; import javax.sql.DataSource; +import java.lang.reflect.Method; import java.sql.SQLException; /** @@ -38,12 +40,31 @@ import java.sql.SQLException; * @author fengshuonan * @date 2020/10/16 17:02 */ +@Slf4j public class CustomDatabaseIdProvider implements DatabaseIdProvider { @Override public String getDatabaseId(DataSource dataSource) throws SQLException { - String url = dataSource.getConnection().getMetaData().getURL(); + String url = ""; + + try { + Class XAClass = Class.forName("io.seata.rm.datasource.xa.DataSourceProxyXA"); + + // xa的dataSource + if (XAClass.isInstance(dataSource)) { + Method xaMethod = XAClass.getMethod("getResourceId"); + Object xaResult = xaMethod.invoke(dataSource); + url = xaResult.toString(); + } else { + // 其他的dataSource类型还走原有的逻辑 + url = dataSource.getConnection().getMetaData().getURL(); + } + + } catch (Exception e) { + log.error("CustomDatabaseIdProvider无法判断当前数据源类型", e); + return DbTypeEnum.MYSQL.getCode(); + } if (url.contains(DbTypeEnum.ORACLE.getCode())) { return DbTypeEnum.ORACLE.getCode();