Несколько источников данных и JdbcTemplate динамически при загрузке Spring - PullRequest
0 голосов
/ 07 ноября 2019

Я хочу динамически создавать источник данных и jdbctemplate, потому что впервые не знаю имен баз данных и других свойств. Как я могу инициализировать jdbcTemplate и DataSource. Я читаю этот файл yaml и преобразую его в свой собственный объект.

Мой код конфигурации:

@Configuration
public class DataSourceConfiguration {

    @Value("${datasource.config.path}")
    private String datasourcePath;

private MyConf myConf;

@Getter
private Map<String, DataSource> dataSourceMap = new HashMap<>();

@Getter
private Map<String, JdbcTemplate> jdbcTemplateMap = new HashMap<>();


@PostConstruct
public void init() throws InvalidValueException {
    myConf = parse();
    createDataSources();
    createJdbcTemplate();
}

public MyConf parse() throws InvalidValueException {
    try (InputStream io = new FileInputStream(datasourcePath)) {
        Representer representer = new Representer();
        representer.getPropertyUtils().setSkipMissingProperties(true);

        MyConf newDataSource = new Yaml(new Constructor(MyConf.class), representer).load(io);
        newDataSource.validate();
        return newDataSource;
    } catch (IOException e) {
        log.error("Initialization exception.");
        throw new InitializationException(e);
    } catch (YAMLException e) {
        log.error("YAML parsing exception - " + e.getMessage());
        throw new YAMLException("Yaml parsing exception ", e);
    } catch (InvalidValueException ex) {
        throw new InvalidValueException(String.format("Config is invalid -> %s ", ex.getMessage()));
    }
}


private void createDataSources() {
    for (DataSourceConfig dp : myConf.getDatasource()) {
        dataSourceMap.put(dp.getDatabase(), DataSourceBuilder.create()
                .username(dp.getUsername())
                .password(dp.getPassword())
                .url(dp.getJdbcUrl())
                .driverClassName(dp.getDriverClassName())
                .build());
    }
}

private void createJdbcTemplate() {
    dataSourceMap.forEach((k, v) -> jdbcTemplateMap.put(k, new JdbcTemplate(v)));
}


@Bean(name = "jdbcTemplate")
@Scope(BeanDefinition.SCOPE_PROTOTYPE)
public JdbcTemplate createJdbcTemplate1(DataSource dataSource){
        return jdbcTemplateMap.get("ONSUBS");
    }

}

application.properties, файл, как показано ниже.

datasource.config.path=datasource.yml

datasource yml, как показано ниже

datasource:
  - database: testDB
    jdbcUrl: jdbc:oracle:thin:@//.....(I have removed now)
    username: admin
    password: admin
    driverClassName: oracle.jdbc.OracleDriver

  - database: testDB2
    jdbcUrl: jdbc:oracle:thin:@//.....(I have removed now)
    username: admin
    password: admin
    driverClassName: oracle.jdbc.OracleDriver

МойГлавный вопросПоскольку у меня будет более одного источника данных, мне нужен один и тот же jdbcTemplate. Как я могу создать их динамически в Spring загрузочной Java.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...