This is an automated email from the ASF dual-hosted git repository.

casion pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/linkis.git


The following commit(s) were added to refs/heads/master by this push:
     new d527f20dbe [fix][EC][jdbc] Add configurable validation query for 
different database types (#5412)
d527f20dbe is described below

commit d527f20dbe7318f4a8a04f77c09751f531553165
Author: aiceflower <[email protected]>
AuthorDate: Mon Apr 13 09:54:30 2026 +0800

    [fix][EC][jdbc] Add configurable validation query for different database 
types (#5412)
    
    * #AI COMMIT# fix: Add DB2 validation query support for JDBC engine 
connection pool
    
    - Add DB2-specific validation query "SELECT 1 FROM SYSIBM.SYSDUMMY1"
    - Same pattern as existing Oracle validation query handling
    - Fixes DB2 connection pool validation error when using datasource name
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    
    * #AI COMMIT# fix: Exclude conflicting jars from JDBC plugin assembly
    
    - Exclude Jetty jars to avoid version conflicts with public-module
    - Exclude SLF4J bindings to prevent multiple binding errors
    - Exclude Hadoop jars to use shared public-module versions
    
    These exclusions prevent class loading conflicts when JDBC engine
    starts and uses jars from both plugin lib and public-module.
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    
    * #AI COMMIT# refactor: Make validation query configurable for different 
database types
    
    - Add configuration parameter 'wds.linkis.jdbc.validation.query.mapping'
    - Default mapping: oracle:SELECT 1 FROM DUAL,db2:SELECT 1 FROM 
SYSIBM.SYSDUMMY1
    - Remove hardcoded database-specific validation query logic
    - To add new database type, just update configuration, no code change needed
    
    Benefits:
    - Configuration-driven approach for extensibility
    - Easy to add support for new databases without modifying source code
    - Default values work for most common databases
    
    Usage example:
      Add to linkis-engineconn.properties:
      wds.linkis.jdbc.validation.query.mapping=oracle:SELECT 1 FROM 
DUAL,db2:SELECT 1 FROM SYSIBM.SYSDUMMY1,postgresql:SELECT 1
    
    Co-Authored-By: Claude Opus 4.6 <[email protected]>
    
    ---------
    
    Co-authored-by: Claude Opus 4.6 <[email protected]>
---
 .../jdbc/src/main/assembly/distribution.xml        |  9 +++
 .../engineplugin/jdbc/ConnectionManager.java       | 67 ++++++++++++++++++++--
 .../jdbc/constant/JDBCEngineConnConstant.java      |  6 ++
 .../engineplugin/jdbc/conf/JDBCConfiguration.scala |  9 +++
 4 files changed, 87 insertions(+), 4 deletions(-)

diff --git a/linkis-engineconn-plugins/jdbc/src/main/assembly/distribution.xml 
b/linkis-engineconn-plugins/jdbc/src/main/assembly/distribution.xml
index 8aadec99a3..0e745a9cfc 100644
--- a/linkis-engineconn-plugins/jdbc/src/main/assembly/distribution.xml
+++ b/linkis-engineconn-plugins/jdbc/src/main/assembly/distribution.xml
@@ -45,6 +45,15 @@
                 <exclude>org.apache.hbase:hbase-shaded-protobuf:jar</exclude>
                 
<exclude>org.apache.hbase:hbase-shaded-miscellaneous:jar</exclude>
                 <exclude>org.apache.hbase:hbase-protocol-shaded:jar</exclude>
+                <!-- Exclude conflicting Jetty jars - use from public-module 
-->
+                <exclude>org.eclipse.jetty:jetty-*:jar</exclude>
+                <exclude>org.eclipse.jetty:jetty-runner:jar</exclude>
+                <!-- Exclude SLF4J binding to avoid conflict -->
+                
<exclude>org.apache.logging.log4j:log4j-slf4j-impl:jar</exclude>
+                <exclude>org.slf4j:slf4j-reload4j:jar</exclude>
+                <exclude>org.slf4j:slf4j-log4j12:jar</exclude>
+                <!-- Exclude Hadoop jars - use from public-module -->
+                <exclude>org.apache.hadoop:hadoop-*:jar</exclude>
             </excludes>
         </dependencySet>
     </dependencySets>
diff --git 
a/linkis-engineconn-plugins/jdbc/src/main/java/org/apache/linkis/manager/engineplugin/jdbc/ConnectionManager.java
 
b/linkis-engineconn-plugins/jdbc/src/main/java/org/apache/linkis/manager/engineplugin/jdbc/ConnectionManager.java
index db1c2ce9c6..2cbce3abee 100644
--- 
a/linkis-engineconn-plugins/jdbc/src/main/java/org/apache/linkis/manager/engineplugin/jdbc/ConnectionManager.java
+++ 
b/linkis-engineconn-plugins/jdbc/src/main/java/org/apache/linkis/manager/engineplugin/jdbc/ConnectionManager.java
@@ -57,6 +57,9 @@ public class ConnectionManager {
   private final Map<String, DataSource> dataSourceFactories;
   private final JDBCDataSourceConfigurations jdbcDataSourceConfigurations;
 
+  // Cache for validation query mapping parsed from configuration
+  private volatile Map<String, String> validationQueryMapping = null;
+
   private static volatile ConnectionManager connectionManager; // NOSONAR
   private ScheduledExecutorService scheduledExecutorService;
   private Integer kinitFailCount = 0;
@@ -64,6 +67,54 @@ public class ConnectionManager {
   private ConnectionManager() {
     jdbcDataSourceConfigurations = new JDBCDataSourceConfigurations();
     dataSourceFactories = new HashMap<>();
+    initValidationQueryMapping();
+  }
+
+  /**
+   * Parse validation query mapping from configuration. Format: 
dbType1:query1,dbType2:query2,...
+   * Example: oracle:SELECT 1 FROM DUAL,db2:SELECT 1 FROM SYSIBM.SYSDUMMY1
+   */
+  private void initValidationQueryMapping() {
+    String mappingConfig = 
JDBCConfiguration$.MODULE$.JDBC_VALIDATION_QUERY_MAPPING();
+    Map<String, String> mapping = new HashMap<>();
+    if (StringUtils.isNotBlank(mappingConfig)) {
+      String[] entries = mappingConfig.split(",");
+      for (String entry : entries) {
+        String[] parts = entry.split(":");
+        if (parts.length == 2) {
+          String dbType = parts[0].trim().toLowerCase();
+          String query = parts[1].trim();
+          mapping.put(dbType, query);
+          LOG.info("Loaded validation query mapping: {} -> {}", dbType, query);
+        }
+      }
+    }
+    this.validationQueryMapping = mapping;
+  }
+
+  /**
+   * Get validation query for a specific JDBC URL based on database type. 
Returns null if no
+   * specific mapping found (will use default "SELECT 1").
+   *
+   * @param jdbcUrl the JDBC connection URL
+   * @return the validation query for this database type, or null if using 
default
+   */
+  private String getValidationQueryFromUrl(String jdbcUrl) {
+    if (jdbcUrl == null || validationQueryMapping == null || 
validationQueryMapping.isEmpty()) {
+      return null;
+    }
+    String lowerUrl = jdbcUrl.toLowerCase();
+    for (Map.Entry<String, String> entry : validationQueryMapping.entrySet()) {
+      if (lowerUrl.contains(entry.getKey())) {
+        LOG.debug(
+            "Using validation query '{}' for database type '{}' from URL: {}",
+            entry.getValue(),
+            entry.getKey(),
+            jdbcUrl);
+        return entry.getValue();
+      }
+    }
+    return null;
   }
 
   public static ConnectionManager getInstance() {
@@ -203,9 +254,13 @@ public class ConnectionManager {
     DruidDataSource datasource = new DruidDataSource();
     LOG.info("Database connection address information(数据库连接地址信息)=" + dbUrl);
     datasource.setUrl(dbUrl);
-    if (dbUrl.toLowerCase().contains("oracle")) {
-      datasource.setValidationQuery("SELECT 1 FROM DUAL");
+
+    // Set validation query based on database type from configuration
+    String dbSpecificValidationQuery = getValidationQueryFromUrl(dbUrl);
+    if (dbSpecificValidationQuery != null) {
+      datasource.setValidationQuery(dbSpecificValidationQuery);
     }
+
     datasource.setUsername(username);
     if (AESUtils.LINKIS_DATASOURCE_AES_SWITCH.getValue()) {
       // decrypt
@@ -246,9 +301,13 @@ public class ConnectionManager {
         }
       }
     }
-    if (url.contains("oracle")) {
-      ((DruidDataSource) dataSource).setValidationQuery("SELECT 1 FROM DUAL");
+
+    // Set validation query based on database type from configuration
+    String dbSpecificValidationQuery = getValidationQueryFromUrl(url);
+    if (dbSpecificValidationQuery != null) {
+      ((DruidDataSource) 
dataSource).setValidationQuery(dbSpecificValidationQuery);
     }
+
     return dataSource.getConnection();
   }
 
diff --git 
a/linkis-engineconn-plugins/jdbc/src/main/java/org/apache/linkis/manager/engineplugin/jdbc/constant/JDBCEngineConnConstant.java
 
b/linkis-engineconn-plugins/jdbc/src/main/java/org/apache/linkis/manager/engineplugin/jdbc/constant/JDBCEngineConnConstant.java
index 50e1c0e653..96b93c44a7 100644
--- 
a/linkis-engineconn-plugins/jdbc/src/main/java/org/apache/linkis/manager/engineplugin/jdbc/constant/JDBCEngineConnConstant.java
+++ 
b/linkis-engineconn-plugins/jdbc/src/main/java/org/apache/linkis/manager/engineplugin/jdbc/constant/JDBCEngineConnConstant.java
@@ -57,6 +57,12 @@ public class JDBCEngineConnConstant {
   public static final String JDBC_POOL_TEST_WHILE_IDLE = 
"wds.linkis.jdbc.pool.testWhileIdle";
   public static final String JDBC_POOL_VALIDATION_QUERY = 
"wds.linkis.jdbc.pool.validationQuery";
   public static final String JDBC_POOL_DEFAULT_VALIDATION_QUERY = "SELECT 1";
+
+  // Configuration for database-specific validation queries
+  // Format: dbType1:query1,dbType2:query2,...
+  // Example: oracle:SELECT 1 FROM DUAL,db2:SELECT 1 FROM 
SYSIBM.SYSDUMMY1,mysql:SELECT 1
+  public static final String JDBC_VALIDATION_QUERY_MAPPING =
+      "wds.linkis.jdbc.validation.query.mapping";
   public static final String JDBC_POOL_TIME_BETWEEN_MIN_EVIC_IDLE_MS =
       "wds.linkis.jdbc.pool.minEvictableIdleTimeMillis";
   public static final String JDBC_POOL_TIME_BETWEEN_EVIC_RUNS_MS =
diff --git 
a/linkis-engineconn-plugins/jdbc/src/main/scala/org/apache/linkis/manager/engineplugin/jdbc/conf/JDBCConfiguration.scala
 
b/linkis-engineconn-plugins/jdbc/src/main/scala/org/apache/linkis/manager/engineplugin/jdbc/conf/JDBCConfiguration.scala
index 2b70663ea8..ce1bb4d09a 100644
--- 
a/linkis-engineconn-plugins/jdbc/src/main/scala/org/apache/linkis/manager/engineplugin/jdbc/conf/JDBCConfiguration.scala
+++ 
b/linkis-engineconn-plugins/jdbc/src/main/scala/org/apache/linkis/manager/engineplugin/jdbc/conf/JDBCConfiguration.scala
@@ -43,4 +43,13 @@ object JDBCConfiguration {
   val SUPPORT_CONN_PARAM_EXECUTE_ENABLE: Boolean =
     CommonVars[Boolean]("linkis.support.conn.param.execute.enable", 
true).getValue
 
+  // Validation query mapping for different database types
+  // Format: dbType1:query1,dbType2:query2,...
+  // Default includes common databases that need non-standard validation 
queries
+  val JDBC_VALIDATION_QUERY_MAPPING: String =
+    CommonVars[String](
+      "wds.linkis.jdbc.validation.query.mapping",
+      "oracle:SELECT 1 FROM DUAL,db2:SELECT 1 FROM SYSIBM.SYSDUMMY1"
+    ).getValue
+
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to