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 d39ccce2..a0cc2dff 100644 --- a/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java +++ b/backend/src/main/java/com/yfd/platform/datasource/DynamicDataSourceRegistry.java @@ -200,8 +200,9 @@ public class DynamicDataSourceRegistry { ? conf.getConnTimeout() : 30000L; ds.setMaxWait(connTimeout); - // 通用连接池配置 - ds.setValidationQuery("SELECT 1"); + // 通用连接池配置:根据 URL 自动选择正确的 validationQuery + // Oracle 需要 SELECT 1 FROM DUAL,DM/MySQL/PostgreSQL 用 SELECT 1 即可 + ds.setValidationQuery(resolveValidationQuery(driver, conf.getUrl())); ds.setValidationQueryTimeout(3); ds.setTestWhileIdle(true); ds.setTestOnBorrow(false); @@ -254,6 +255,24 @@ public class DynamicDataSourceRegistry { throw new IllegalArgumentException("无法根据 URL 自动识别驱动类型: " + url); } + /** + * 根据驱动/URL 自动选择正确的 validationQuery + * + */ + private String resolveValidationQuery(String driverClassName, String url) { + String lowerDriver = driverClassName != null ? driverClassName.toLowerCase() : ""; + String lowerUrl = url != null ? url.toLowerCase() : ""; + // Oracle 驱动 + if (lowerDriver.contains("oracle") || lowerUrl.contains("jdbc:oracle")) { + return "SELECT 1 FROM DUAL"; + } + // 其他数据库(DM / MySQL / PostgreSQL / SQLServer 等)通用 + return "SELECT 1"; + } + /** * 将数据库行映射为实体 */