feat(datasource): 支持通过 query-ds-enabled 关闭数据库配置表加载扩展数据源

新增 spring.datasource.druid.query-ds-enabled 配置项,默认开启;显式设为
false 时跳过从 gen_datasource_conf 表加载扩展数据源,便于不依赖该表的部署
场景关闭此行为。
This commit is contained in:
PIGCLOUD committed 2026-08-01 11:59:35 +08:00
1 parent 76ea7f45ac
commit 2bc5fb5f24
3 files changed
+90

No files matched your search

@@ -39,4 +39,9 @@ public class DruidDataSourceProperties extends DruidConfig {
*/
private String queryDsSql = "select * from gen_datasource_conf where del_flag = ?";
/**
* 是否从数据库配置表加载扩展数据源,默认开启
*/
private Boolean queryDsEnabled = true;
}
@@ -28,10 +28,12 @@ import com.pig4cloud.pigx.common.datasource.util.DsTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.jasypt.encryption.StringEncryptor;
import javax.sql.DataSource;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@@ -58,6 +60,20 @@ public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvide
this.properties = properties;
}
/**
* 加载所有数据源
*
* @return 所有数据源
*/
@Override
public Map<String, DataSource> loadDataSources() {
if (!isQueryDsEnabled()) {
log.debug("spring.datasource.druid.query-ds-enabled=false,已关闭数据库配置表加载");
return Collections.emptyMap();
}
return super.loadDataSources();
}
/**
* 执行语句获得数据源参数
*
@@ -123,4 +139,13 @@ public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvide
return map;
}
/**
* 是否开启从数据库配置表加载扩展数据源
*
* @return true 开启(默认);仅显式配置为 false 时关闭
*/
boolean isQueryDsEnabled() {
return !Boolean.FALSE.equals(properties.getQueryDsEnabled());
}
}
@@ -0,0 +1,60 @@
package com.pig4cloud.pigx.common.datasource.config;
import com.baomidou.dynamic.datasource.creator.DefaultDataSourceCreator;
import org.jasypt.encryption.StringEncryptor;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.assertThat;
/**
* {@link JdbcDynamicDataSourceProvider} 单元测试:验证 query-ds-enabled 开关的默认开启与显式关闭行为
*
* @author lengleng
* @date 2026/7/6
*/
class JdbcDynamicDataSourceProviderTests {
@Test
void enablesJdbcTableLoadingByDefault() {
DruidDataSourceProperties properties = druidProperties();
JdbcDynamicDataSourceProvider provider = newProvider(properties);
assertThat(provider.isQueryDsEnabled()).isTrue();
}
@Test
void skipsJdbcTableLoadingWhenDisabledExplicitly() {
DruidDataSourceProperties properties = druidProperties();
properties.setQueryDsEnabled(false);
JdbcDynamicDataSourceProvider provider = newProvider(properties);
assertThat(provider.loadDataSources()).isEmpty();
assertThat(provider.isQueryDsEnabled()).isFalse();
}
private static JdbcDynamicDataSourceProvider newProvider(DruidDataSourceProperties properties) {
StringEncryptor stringEncryptor = new StringEncryptor() {
@Override
public String encrypt(String message) {
return message;
}
@Override
public String decrypt(String encryptedMessage) {
return encryptedMessage;
}
};
return new JdbcDynamicDataSourceProvider(new DefaultDataSourceCreator(), stringEncryptor, properties);
}
private static DruidDataSourceProperties druidProperties() {
DruidDataSourceProperties properties = new DruidDataSourceProperties();
properties.setDriverClassName("not.exists.Driver");
properties.setUrl("jdbc:not-executed");
properties.setUsername("root");
properties.setPassword("root");
return properties;
}
}