ShayneLin opened a new issue, #28742:
URL: https://github.com/apache/shardingsphere/issues/28742
I use shardingsphere-jdbc-core 5.4.0.
In order to encrypt the database password into ciphertext, HikariDataSource
is inherited and getPassword() is rewritten.As follows:
```
package net.netca.demo.framework.datasource.config;
import com.zaxxer.hikari.HikariDataSource;
import lombok.extern.slf4j.Slf4j;
import net.netca.demo.framework.common.util.EncAndDecryptUtil;
import org.apache.commons.lang3.StringUtils;
@Slf4j
public class DecryptDataSource extends HikariDataSource {
@Override
public String getPassword() {
String password = super.getPassword();
if (StringUtils.isBlank(password)) {
return null;
}
try{
return EncAndDecryptUtil.decrypt(password);
}catch (Exception e){
log.warn("数据库密码解密失败,采用原密码。");
return password;
}
}
}
```
My springboot for shardingsphere in the application-sharding.yml file as
follows:
```
mode:
type: Standalone
repository:
type: JDBC
dataSources:
# 分片数据源
ds0:
dataSourceClassName:
net.netca.demo.framework.datasource.config.DecryptDataSource
driverClassName: com.mysql.cj.jdbc.Driver
jdbcUrl:
jdbc:mysql://ip:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&autoReconnect=true&failOverReadOnly=false&useSSL=false&zeroDateTimeBehavior=CONVERT_TO_NULL&allowPublicKeyRetrieval=true
username: root
password: 882fdd5dc817460f677645a545aaaa5df08d56b3d4766a04
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
minPoolSize: 1
rules:
# 定义需要被shardingjdbc管理的单表
- !SINGLE
tables:
- ds0.*
defaultDataSource: ds0
```
application.yaml
```
spring:
# 上传文件配置
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
# 数据库连接配置
datasource:
driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
url: jdbc:shardingsphere:classpath:application-sharding.yml
```
But,meet some problem,like that:
```
2023-10-12 21:24:33.106 INFO 26300 --- [ main]
com.zaxxer.hikari.HikariDataSource : HikariPool-3 - Start completed.
2023-10-12 21:24:35.315 ERROR 26300 --- [ main]
com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Exception during pool
initialization.
java.lang.NullPointerException: null
at
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData.createDataSourceMetaDataMap(ShardingSphereResourceMetaData.java:79)
~[shardingsphere-infra-common-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData.<init>(ShardingSphereResourceMetaData.java:55)
~[shardingsphere-infra-common-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase.createResourceMetaData(ShardingSphereDatabase.java:126)
~[shardingsphere-infra-common-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase.create(ShardingSphereDatabase.java:120)
~[shardingsphere-infra-common-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase.create(ShardingSphereDatabase.java:92)
~[shardingsphere-infra-common-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory.createGenericDatabases(ExternalMetaDataFactory.java:84)
~[shardingsphere-metadata-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory.create(ExternalMetaDataFactory.java:71)
~[shardingsphere-metadata-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.create(MetaDataContextsFactory.java:95)
~[shardingsphere-mode-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory.create(MetaDataContextsFactory.java:69)
~[shardingsphere-mode-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.mode.manager.standalone.StandaloneContextManagerBuilder.build(StandaloneContextManagerBuilder.java:52)
~[shardingsphere-standalone-mode-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.createContextManager(ShardingSphereDataSource.java:82)
~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource.<init>(ShardingSphereDataSource.java:69)
~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.driver.api.ShardingSphereDataSourceFactory.createDataSource(ShardingSphereDataSourceFactory.java:95)
~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory.createDataSource(YamlShardingSphereDataSourceFactory.java:167)
~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.driver.api.yaml.YamlShardingSphereDataSourceFactory.createDataSource(YamlShardingSphereDataSourceFactory.java:102)
~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.driver.jdbc.core.driver.DriverDataSourceCache.createDataSource(DriverDataSourceCache.java:51)
~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
at
java.util.concurrent.ConcurrentHashMap.computeIfAbsent(ConcurrentHashMap.java:1660)
~[na:1.8.0_111]
at
org.apache.shardingsphere.driver.jdbc.core.driver.DriverDataSourceCache.get(DriverDataSourceCache.java:45)
~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
at
org.apache.shardingsphere.driver.ShardingSphereDriver.connect(ShardingSphereDriver.java:51)
~[shardingsphere-jdbc-core-5.4.0.jar:5.4.0]
```
First,NPE happen at standardProps.get("url").toString(),url is null.
```
private Map<String, DataSourceMetaData> createDataSourceMetaDataMap(final
Map<String, DataSource> dataSources, final Map<String, DatabaseType>
storageTypes) {
Map<String, DataSourceMetaData> result = new
LinkedHashMap<>(dataSources.size(), 1F);
for (Entry<String, DataSource> entry : dataSources.entrySet()) {
Map<String, Object> standardProps =
DataSourcePropertiesCreator.create(entry.getValue()).getConnectionPropertySynonyms().getStandardProperties();
DatabaseType storageType = storageTypes.get(entry.getKey());
result.put(entry.getKey(),
storageType.getDataSourceMetaData(standardProps.get("url").toString(),
standardProps.get("username").toString()));
}
return result;
}
```
Then I analyze the source code found that it is related to this
implementation of
org.apache.shardingsphere.infra.datasource.props.DataSourceProperties
```
public DataSourceProperties(final String dataSourceClassName, final
Map<String, Object> props) {
this.dataSourceClassName = dataSourceClassName;
Optional<DataSourcePoolMetaData> poolMetaData =
TypedSPILoader.findService(DataSourcePoolMetaData.class, dataSourceClassName);
Map<String, String> propertySynonyms = poolMetaData.isPresent() ?
poolMetaData.get().getPropertySynonyms() : Collections.emptyMap();
connectionPropertySynonyms = new ConnectionPropertySynonyms(props,
propertySynonyms);
poolPropertySynonyms = new PoolPropertySynonyms(props,
propertySynonyms);
customDataSourceProperties = new CustomDataSourceProperties(
props, getStandardPropertyKeys(), poolMetaData.isPresent() ?
poolMetaData.get().getTransientFieldNames() : Collections.emptyList(),
propertySynonyms);
}
```
AndataSourceClassName is my custom defined,but
TypedSPILoader.findService(DataSourcePoolMetaData.class, dataSourceClassName)
can`t find the DataSourcePoolMetaData.Map<String, String> propertySynonyms is
null,so new ConnectionPropertySynonyms(props, propertySynonyms) can`t set url
correct.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail:
[email protected]
For queries about this service, please contact Infrastructure at:
[email protected]