diff --git a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java
index 50559e7c..fbfcaab5 100644
--- a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java
+++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java
@@ -14,6 +14,8 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
/**
* 动态数据源注册器,从数据库表 {@code GEN_DATASOURCE_CONF} 读取配置,
@@ -39,9 +41,17 @@ public class DynamicDataSourceRegistry {
private DynamicDataSource dynamicDataSource;
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;
+ });
/**
* 启动时初始化:从数据库表加载所有已启用的数据源并注册
+ *
+ * 异步执行,不阻塞 Spring Boot 启动流程(如 {@code JobRunner} 等 ApplicationRunner)
+ * 即使表不存在或连接不通,主线程启动不受影响,稍后手动 refresh 即可。
*/
@PostConstruct
public void init() {
@@ -64,6 +74,28 @@ public class DynamicDataSourceRegistry {
} catch (Exception e) {
log.error("动态数据源初始化失败(业务主库未就绪,稍后手动刷新即可): {}", e.getMessage());
}
+ REGISTRY_EXECUTOR.submit(() -> {
+ try {
+ log.info("动态数据源后台初始化开始...");
+ List 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());
+ }
+ });
}
/**
diff --git a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java
index e34a1289..262d3342 100644
--- a/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java
+++ b/backend/src/main/java/com/yfd/platform/qgc_env/ime/service/impl/ImeServiceImpl.java
@@ -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(" FROM V_MS_STBPRP_T t ")
.append(" WHERE 1 = 1 ")
- .append(" AND t.BASE_ID IS NOT NULL ");
+ .append(" AND t.BASE_ID IS NOT NULL");
if (CollUtil.isNotEmpty(sttpCodes)) {
List placeholders = new ArrayList<>();
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 ")
.append(") s ON s.baseId = h.BASEID ")
.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 ");
// baseId / baseName 等其它前端过滤(除 sttpCode 外)
String filterSql = buildImeBaseStatFilterCondition(