From a472ab2ec7e051f1cbbce8aa8da7ebce0d61a90f Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 8 Sep 2026 11:50:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BC=98=E5=8C=96=E4=BA=86=E5=8A=A8?= =?UTF-8?q?=E6=80=81=E6=95=B0=E6=8D=AE=E6=BA=90=E8=AF=86=E5=88=AB=E4=B8=8D?= =?UTF-8?q?=E5=88=B0oracle=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../datasource/DynamicDataSourceRegistry.java | 32 +++++++++++++++++++ .../ime/service/impl/ImeServiceImpl.java | 4 +-- 2 files changed, 34 insertions(+), 2 deletions(-) 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(