fix: 测试了动态数据源使用

This commit is contained in:
tangwei 2026-09-08 13:52:35 +08:00
parent 1de9b506af
commit 7bb90d88a3
4 changed files with 160 additions and 1 deletions

View File

@ -78,6 +78,7 @@ public class SecurityConfig {
// .requestMatchers("/threedroamb/**").permitAll() // .requestMatchers("/threedroamb/**").permitAll()
// .requestMatchers("/overview/**").permitAll() // .requestMatchers("/overview/**").permitAll()
.requestMatchers("/wt/**").permitAll() .requestMatchers("/wt/**").permitAll()
.requestMatchers("/datasource/**").permitAll()
.requestMatchers("/system/acctPasswordPolicy/**").permitAll() .requestMatchers("/system/acctPasswordPolicy/**").permitAll()
.requestMatchers("/fb/**").permitAll() .requestMatchers("/fb/**").permitAll()
// .requestMatchers("/base/**").permitAll() // .requestMatchers("/base/**").permitAll()

View File

@ -119,7 +119,7 @@ public class DynamicDataSource extends AbstractRoutingDataSource {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public Set<Object> getRegisteredKeys() { public Set<Object> getRegisteredKeys() {
Map<Object, DataSource> resolved = getResolvedDataSources(); Map<Object, DataSource> resolved = getResolvedDataSources();
return resolved == null ? Set.of() : resolved.keySet(); return resolved.keySet();
} }
/** /**

View File

@ -37,6 +37,9 @@ public class DynamicDataSourceController {
@Resource @Resource
private DynamicDataSource dynamicDataSource; private DynamicDataSource dynamicDataSource;
@Resource
private DynamicDataSourceTestService dynamicDataSourceTestService;
/** /**
* 列出所有已注册的数据源含系统内置 dm-master/dm-slave * 列出所有已注册的数据源含系统内置 dm-master/dm-slave
*/ */
@ -108,4 +111,109 @@ public class DynamicDataSourceController {
return ResponseResult.error("未找到数据源: " + key); return ResponseResult.error("未找到数据源: " + key);
} }
} }
/**
* 测试指定数据源连通性并执行一条查询验证
*
* @param dsKey 数据源路由 key
* @param sql 可选 SQL默认自动选择 SELECT 1 SELECT 1 FROM DUAL
* @return 查询结果
*/
@GetMapping("/test/{dsKey}")
@Operation(summary = "测试数据源连通性(执行查询验证)")
public ResponseResult testDataSource(@PathVariable("dsKey") String dsKey,
@RequestParam(value = "sql", required = false) String sql) {
DataSource ds = dynamicDataSource.getDataSourceByKey(dsKey);
if (ds == null) {
return ResponseResult.error("未找到数据源: " + dsKey + ",请先注册或查看 /datasource/list");
}
// 自动选择默认验证 SQL
if (sql == null || sql.isBlank()) {
String lowerKey = dsKey.toLowerCase();
sql = lowerKey.contains("oracle") ? "SELECT 1 FROM DUAL" : "SELECT 1";
}
final String finalSql = sql;
try {
JdbcTemplate jt = new JdbcTemplate(ds);
List<Map<String, Object>> result = jt.execute((StatementCallback<List<Map<String, Object>>>) stmt -> {
try (ResultSet rs = stmt.executeQuery(finalSql)) {
ResultSetMetaData meta = rs.getMetaData();
int colCount = meta.getColumnCount();
List<Map<String, Object>> rows = new ArrayList<>();
while (rs.next()) {
Map<String, Object> row = new LinkedHashMap<>();
for (int i = 1; i <= colCount; i++) {
row.put(meta.getColumnLabel(i), rs.getObject(i));
}
rows.add(row);
}
return rows;
}
});
Map<String, Object> data = new LinkedHashMap<>();
data.put("dsKey", dsKey);
data.put("sql", sql);
data.put("dsType", ds.getClass().getSimpleName());
data.put("rowCount", result.size());
data.put("rows", result);
return ResponseResult.successData(data);
} catch (Exception e) {
Map<String, Object> data = new LinkedHashMap<>();
data.put("dsKey", dsKey);
data.put("sql", sql);
data.put("error", e.getMessage());
return ResponseResult.error("数据源查询失败: " + e.getMessage());
}
}
/**
* 使用 @TargetDataSource 注解测试数据源AOP 路由方式
* <p>
* 根据 dsKey 路由到对应的注解方法 AOP 自动切换数据源验证完整的注解路由链路
* 支持以下 keydm-master / dm-slave / oracle-master / oracle-slave / devtw-oracle-master / devtw-oracle-slave
*/
@GetMapping("/test-anno/{dsKey}")
@Operation(summary = "注解方式测试数据源(@TargetDataSource AOP 路由)")
public ResponseResult testDataSourceByAnnotation(@PathVariable("dsKey") String dsKey) {
try {
List<Map<String, Object>> rows;
switch (dsKey) {
case "dm-master":
rows = dynamicDataSourceTestService.testDmMaster();
break;
case "dm-slave":
rows = dynamicDataSourceTestService.testDmSlave();
break;
case "oracle-master":
rows = dynamicDataSourceTestService.testOracleMaster();
break;
case "oracle-slave":
rows = dynamicDataSourceTestService.testOracleSlave();
break;
case "ext-oracle-master":
rows = dynamicDataSourceTestService.testDevtwOracleMaster();
break;
case "ext-oracle-slave":
rows = dynamicDataSourceTestService.testDevtwOracleSlave();
break;
default:
return ResponseResult.error("未预定义注解方法的数据源 key: " + dsKey
+ ",可选: dm-master / dm-slave / oracle-master / oracle-slave / devtw-oracle-master / devtw-oracle-slave");
}
// 方法执行完后 AOP 已自动清除上下文在这里获取不到路由 key
Map<String, Object> data = new LinkedHashMap<>();
data.put("dsKey", dsKey);
data.put("method", "动态数据源切换方式");
data.put("rowCount", rows.size());
data.put("rows", rows);
return ResponseResult.successData(data);
} catch (Exception e) {
return ResponseResult.error("注解方式数据源测试失败: " + e.getMessage());
}
}
} }

View File

@ -0,0 +1,50 @@
package com.yfd.platform.datasource;
import com.yfd.platform.common.MicroservicDynamicSQLMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* 动态数据源测试服务使用 @TargetDataSource 注解切换数据源
* <p>
* 每个方法对应一个固定数据源 key通过注解指定验证 AOP 路由是否正常工作
*/
@Service
public class DynamicDataSourceTestService {
@Resource
private MicroservicDynamicSQLMapper microservicDynamicSQLMapper;
@TargetDataSource(DataSourceKeys.DM_MASTER)
public List<Map<String, Object>> testDmMaster() {
return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null);
}
@TargetDataSource(DataSourceKeys.DM_SLAVE)
public List<Map<String, Object>> testDmSlave() {
return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null);
}
@TargetDataSource("oracle-master")
public List<Map<String, Object>> testOracleMaster() {
return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null);
}
@TargetDataSource("oracle-slave")
public List<Map<String, Object>> testOracleSlave() {
return microservicDynamicSQLMapper.getAllList("SELECT 1 AS VAL FROM DUAL", null);
}
@TargetDataSource("ext-oracle-master")
public List<Map<String, Object>> testDevtwOracleMaster() {
return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null);
}
@TargetDataSource("ext-oracle-slave")
public List<Map<String, Object>> testDevtwOracleSlave() {
return microservicDynamicSQLMapper.getAllList("select count(*) from SD_WTRV_R WHERE is_deleted = 0", null);
}
}