运行时创建多个Jdbctemplate指向运行时不同的数据库

Create Multipe Jdbctemplate at runtime pointing to diffrent databases in runtime

Spring 启动 有没有办法在运行时创建 Jdbctemplate 指向 不同的 MySQL 数据库

运行时我有所有需要的信息。

所有客户端的数据库结构都相同,但实例不同。

我也试过 How to create multiple Jdbctemplate beans, pointing to different Mysql databases, in runtime? 但找不到任何解决方案。

我想这可以这样做:

@Component
public class JdbcTemplateProvider {

    private final Map<String, DataSource> databaseNameToDataSourceMap;
    private final JdbcProperties properties;

    public JdbcTemplateProvider(List<DataSource> dataSources, JdbcProperties properties) {
        this.databaseNameToDataSourceMap = this.buildDatabaseToDataSourceMap(dataSources);
        this.properties = properties;
    }

    public JdbcTemplate byDatabaseName(String database) {
        DataSource dataSource = this.databaseNameToDataSourceMap.get(database);
        return buildJdbcTemplate(dataSource);
    }

    private Map<String, DataSource> buildDatabaseToDataSourceMap(List<DataSource> dataSources) {
        return new ConcurrentHashMap<>();
    }

    private JdbcTemplate buildJdbcTemplate(DataSource dataSource) {
        JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
        JdbcProperties.Template template = properties.getTemplate();
        jdbcTemplate.setFetchSize(template.getFetchSize());
        jdbcTemplate.setMaxRows(template.getMaxRows());
        if (template.getQueryTimeout() != null) {
            jdbcTemplate.setQueryTimeout((int) template.getQueryTimeout().getSeconds());
        }
        return jdbcTemplate;
    }

}

如果这个问题是 Spring Boot 本身可以处理这个问题,据我所知可能没有任何内置解决方案。

org.springframework.boot.autoconfigure.jdbc.JdbcProperties 读取前缀为 spring.jdbc 的属性值。如果它在您的类路径中可用,这将能够根据配置配置新构建的 JdbcTemplate 实例。

尽管构建数据库名称到数据源的映射,但您将构建自己的逻辑。