运行时创建多个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
实例。
尽管构建数据库名称到数据源的映射,但您将构建自己的逻辑。
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
实例。
尽管构建数据库名称到数据源的映射,但您将构建自己的逻辑。