fix: 优化了动态数据源识别不到oracle问题
This commit is contained in:
parent
f0844de9ec
commit
a472ab2ec7
@ -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());
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@ -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(
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user