我正在使用SpringBoot编写微服务,我需要动态选择数据源。我将基于该参数选择数据源。每个数据源将指向具有相同架构(相同的表,触发器,存储过程等)的Oracle数据库。如何执行此要求?
答案 0 :(得分:0)
我确实实现了类似的方法...
我使用 application.properties 存储数据源连接
Datasource drive name
spring.datasource.driver-class-name=
spring.datasource.url=
spring.datasource.username=
spring.datasource.password=
有一些关于如何读取和写入属性的代码示例
创建一个端点以更新您的属性
@PutMapping("/update")
public ResponseEntity<?> updateConnection(@RequestBody final List<ConfigurationProperty> properies) {
LOGGER.trace("Updating data source properties ");
for (final ConfigurationProperty configurationProperty : properies) {
config.getConfigurationProvider().persistDatabaseProperty(configurationProperty.getPropertyName(),
configurationProperty.getPropertyValue());
}
}
}
return new ResponseEntity<> (HttpStatus.OK);
}
从经验中获得的另一个技巧是在执行更新端点之前ping连接。 :) 关于我的实现的唯一结论是,用户将需要重新启动服务器以对提取进行更改。
答案 1 :(得分:0)
在启动时配置所有数据源,然后:
要么:
a。有一个实现每个数据源的不同的repo类,请在调用相应的repo之前检查参数。
b。有一个repo类可以检查参数并使用相应的数据源进行查询。
答案 2 :(得分:0)
您必须在application.properties中实现两个配置数据源,然后配置两个EntityManagerFactory和TransactionManager。您可以为每个数据源使用不同的存储库在两个数据源之间进行切换。
application.properties
first.datasource.url=jdbc:oracle:thin:@//host:1521/firstdb
first.datasource.username=first
first.datasource.password=first
first.datasource.driver-class-name=oracle.jdbc.OracleDriver
second.datasource.url=jdbc:oracle:thin:@//host:1521/firstdb
second.datasource.username=second
second.datasource.password=second
second.datasource.driver-class-name=oracle.jdbc.OracleDriver
spring.jpa.database=default
每个实体和存储库有两个软件包,还有两个配置要设置。
第一
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "entityManagerFactory",
basePackages = { "com.system.first.repo" }
)
public class FirstDbConfig {
@Primary
@Bean(name = "dataSource")
@ConfigurationProperties(prefix = "first.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "entityManagerFactory")
public LocalContainerEntityManagerFactoryBean
entityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("dataSource") DataSource dataSource
) {
return builder
.dataSource(dataSource)
.packages("com.system.first.domain")
.persistenceUnit("first")
.build();
}
@Primary
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(
@Qualifier("entityManagerFactory") EntityManagerFactory
entityManagerFactory
) {
return new JpaTransactionManager(entityManagerFactory);
}
}
第二:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef = "secondEntityManagerFactory",
transactionManagerRef = "secondTransactionManager",
basePackages = { "com.system.second.repo" }
)
public class SecondDbConfig {
@Bean(name = "secondDataSource")
@ConfigurationProperties(prefix = "second.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "secondEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean
secondEntityManagerFactory(
EntityManagerFactoryBuilder builder,
@Qualifier("secondDataSource") DataSource dataSource
) {
return
builder
.dataSource(dataSource)
.packages("com.system.second.domain")
.persistenceUnit("second")
.build();
}
@Bean(name = "secondTransactionManager")
public PlatformTransactionManager secondTransactionManager(
@Qualifier("secondEntityManagerFactory") EntityManagerFactory
secondEntityManagerFactory
) {
return new JpaTransactionManager(secondEntityManagerFactory);
}
}
答案 3 :(得分:0)
在springboot中尝试这个AbstractRoutingDataSource。
https://spring.io/blog/2007/01/23/dynamic-datasource-routing/