fix: 优化了动态数据源识别不到oracle问题

This commit is contained in:
tangwei 2026-09-08 11:50:53 +08:00
parent f0844de9ec
commit a472ab2ec7
2 changed files with 34 additions and 2 deletions

View File

@ -14,6 +14,8 @@ import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/** /**
* 动态数据源注册器从数据库表 {@code GEN_DATASOURCE_CONF} 读取配置 * 动态数据源注册器从数据库表 {@code GEN_DATASOURCE_CONF} 读取配置
@ -39,9 +41,17 @@ public class DynamicDataSourceRegistry {
private DynamicDataSource dynamicDataSource; private DynamicDataSource dynamicDataSource;
private final Object refreshLock = new Object(); private final Object refreshLock = new Object();
private static final ExecutorService REGISTRY_EXECUTOR = Executors.newSingleThreadExecutor(r -> {
Thread t = new Thread(r, "dynamic-ds-registry");
t.setDaemon(true);
return t;
});
/** /**
* 启动时初始化从数据库表加载所有已启用的数据源并注册 * 启动时初始化从数据库表加载所有已启用的数据源并注册
* <p>
* 异步执行不阻塞 Spring Boot 启动流程 {@code JobRunner} ApplicationRunner
* 即使表不存在或连接不通主线程启动不受影响稍后手动 refresh 即可
*/ */
@PostConstruct @PostConstruct
public void init() { public void init() {
@ -64,6 +74,28 @@ public class DynamicDataSourceRegistry {
} catch (Exception e) { } catch (Exception e) {
log.error("动态数据源初始化失败(业务主库未就绪,稍后手动刷新即可): {}", e.getMessage()); log.error("动态数据源初始化失败(业务主库未就绪,稍后手动刷新即可): {}", e.getMessage());
} }
REGISTRY_EXECUTOR.submit(() -> {
try {
log.info("动态数据源后台初始化开始...");
List<GenDatasourceConf> configs = loadConfigs();
if (configs.isEmpty()) {
log.info("GEN_DATASOURCE_CONF 表中无已启用的动态数据源配置,跳过注册");
return;
}
int success = 0;
int fail = 0;
for (GenDatasourceConf conf : configs) {
if (tryRegister(conf)) {
success++;
} else {
fail++;
}
}
log.info("动态数据源初始化完成: 成功={}, 失败={}", success, fail);
} catch (Exception e) {
log.error("动态数据源初始化失败(业务主库未就绪,稍后手动刷新即可): {}", e.getMessage());
}
});
} }
/** /**

View File

@ -65,7 +65,7 @@ public class ImeServiceImpl implements ImeService {
.append(" SELECT t.BASE_ID AS baseId, t.STTP AS sttpCode, COUNT(1) AS cnt ") .append(" SELECT t.BASE_ID AS baseId, t.STTP AS sttpCode, COUNT(1) AS cnt ")
.append(" FROM V_MS_STBPRP_T t ") .append(" FROM V_MS_STBPRP_T t ")
.append(" WHERE 1 = 1 ") .append(" WHERE 1 = 1 ")
.append(" AND t.BASE_ID IS NOT NULL "); .append(" AND t.BASE_ID IS NOT NULL");
if (CollUtil.isNotEmpty(sttpCodes)) { if (CollUtil.isNotEmpty(sttpCodes)) {
List<String> placeholders = new ArrayList<>(); List<String> placeholders = new ArrayList<>();
for (int i = 0; i < sttpCodes.size(); i++) { for (int i = 0; i < sttpCodes.size(); i++) {
@ -78,7 +78,7 @@ public class ImeServiceImpl implements ImeService {
sql.append(" GROUP BY t.BASE_ID, t.STTP ") sql.append(" GROUP BY t.BASE_ID, t.STTP ")
.append(") s ON s.baseId = h.BASEID ") .append(") s ON s.baseId = h.BASEID ")
.append("WHERE 1 = 1 ") .append("WHERE 1 = 1 ")
.append("AND NVL(h.IS_DELETED, 0) = 0 ") .append("AND NVL(h.IS_DELETED, 0) = 0 AND h.BASEID !='all' ")
.append("AND NVL(h.ENABLED, 1) = 1 "); .append("AND NVL(h.ENABLED, 1) = 1 ");
// baseId / baseName 等其它前端过滤( sttpCode ) // baseId / baseName 等其它前端过滤( sttpCode )
String filterSql = buildImeBaseStatFilterCondition( String filterSql = buildImeBaseStatFilterCondition(