From 1de9b506af50badc505b4a2252619ea75ecd2e1c Mon Sep 17 00:00:00 2001 From: tangwei Date: Tue, 8 Sep 2026 11:52:03 +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 | 23 +++++++++++++++++-- 1 file changed, 21 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 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"; + } + /** * 将数据库行映射为实体 */