diff --git a/linkis-engineconn-plugins/jdbc/src/main/assembly/distribution.xml b/linkis-engineconn-plugins/jdbc/src/main/assembly/distribution.xml
index 8aadec99a3b..0e745a9cfcf 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 @@
org.apache.hbase:hbase-shaded-protobuf:jar
org.apache.hbase:hbase-shaded-miscellaneous:jar
org.apache.hbase:hbase-protocol-shaded:jar
+
+ org.eclipse.jetty:jetty-*:jar
+ org.eclipse.jetty:jetty-runner:jar
+
+ org.apache.logging.log4j:log4j-slf4j-impl:jar
+ org.slf4j:slf4j-reload4j:jar
+ org.slf4j:slf4j-log4j12:jar
+
+ org.apache.hadoop:hadoop-*:jar
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 db1c2ce9c6f..2cbce3abee2 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 dataSourceFactories;
private final JDBCDataSourceConfigurations jdbcDataSourceConfigurations;
+ // Cache for validation query mapping parsed from configuration
+ private volatile Map 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 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 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 @@ protected DataSource buildDataSource(String dbUrl, Map propertie
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 @@ private Connection getConnectionFromDataSource(
}
}
}
- 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 50e1c0e6530..96b93c44a78 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 @@ private 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 2b70663ea82..ce1bb4d09aa 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
+
}