我正在微服务中通过以下方式创建数据源对象:
@Autowired
private EncryptionUtil encryptionutils;
public ComboPooledDataSource appDataSource() throws PropertyVetoException {
ComboPooledDataSource dataSource = new ComboPooledDataSource();
DatasourceDto datasourceDto = null;
try {
datasourceDto = encryptionutils.getDbCredentials("servicename", "oracle", env.getProperty("env"));
} catch (FileNotFoundException e) {
log.info().logException("Exception",e);
}
if (datasourceDto == null || StringUtils.isEmpty(datasourceDto.getPassword()) || StringUtils
.isEmpty(datasourceDto.getHost()) || StringUtils.isEmpty(datasourceDto.getUsername())) {
throw new DBDetailsNotFoundException("Failed to get db credentials");
}
dataSource.setDriverClass(dataSourceProperties.getDriverClassName());
dataSource.setJdbcUrl(datasourceDto.getHost());
dataSource.setUser(datasourceDto.getUsername());
dataSource.setPassword(datasourceDto.getPassword());
configureConnectionPool(dataSource);
return dataSource;
}
此代码是微服务的一部分,并且运行良好。 现在,我需要从该微服务中分离出所有数据库配置,并创建一个独立的数据库服务,该服务稍后将被微服务和其他微服务用作 jar。
这实际上是从一个 Secrets yml 文件中读取数据库信息,该文件具有基于如下层次结构的 Oracle 相关信息:
servicename:
oracle:
username:
host:
password:
servicename2:
oracle:
username:
host:
password:
其中“servicename”、“servicename2”是微服务名称。
现在,我面临的问题是这样的:
datasourceDto = encryptionutils.getDbCredentials("servicename", "oracle", env.getProperty("env"));
问题在于,早期数据库相关代码是每个需要数据库连接的微服务的一部分,并且特定微服务的名称在这一行中分别被硬编码为“servicename”或“servicename2”以访问相应的数据库信息。因此,当我连接到特定微服务的数据库时,这工作正常。
现在,由于我将此代码移至通用数据库服务模块,因此“服务名称”不能再进行硬编码,因为此数据库服务也将被所有其他微服务使用。
如果我将其硬编码为一个服务名称,其他服务也将最终连接该服务的数据库,这在这里是不希望的。所以,我的问题是如何在该行中配置此“servicename”,以便当微服务“servicename”尝试访问数据库时,从 db Secrets yml 中获取“servicename”的相应数据库信息,并且当“servicename2” “微服务想要连接到数据库,它会获取“servicename2”的数据库信息。
能不能不传递参数或者使用反射来区分调用的类和方法。查找表等...