Spring Boot/Spring Batch:使用和配置两个数据源通过应用程序属性
我正在使用Spring Boot/Spring Batch,需要提供两个JDBC数据源。
我找不到一种从我的application.properties
自动加载配置参数的方法。
//BatchConfiguration which uses both Data Sources:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Bean
public JdbcBatchItemWriter<Customer> writer(@Qualifier("dataSourceOne") DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Customer>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("..."))
.dataSource(dataSource)
.build();
}
@Bean
public JdbcCursorItemReader<Customer> reader(@Qualifier("dataSourceTwo") DataSource dataSource) {
return new JdbcCursorItemReaderBuilder<Customer>()
.dataSource(dataSource)
.name("myItemReader")
.sql("...")
.rowMapper(new CustomerRowMapper())
.build();
}
上面的代码可与以下配置一起使用,该配置直接提供了数据源:
//WORKING SOLUTION
@Configuration(proxyBeanMethods = false)
public class DataSourcesConfiguration {
@Bean("dataSourceOne")
@Primary
public DataSource dataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url("jdbc:h2:mem:AAA-h2");
dataSourceBuilder.username("AAA");
dataSourceBuilder.password("AAA");
dataSourceBuilder.driverClassName("org.h2.Driver");
return dataSourceBuilder.build();
}
@Bean("dataSourceTwo")
public DataSource dataSourceTwo() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url("jdbc:oracle:thin:@AAA");
dataSourceBuilder.username("AAA");
dataSourceBuilder.password("AAA");
dataSourceBuilder.driverClassName("oracle.jdbc.driver.OracleDriver");
return dataSourceBuilder.build();
}
}
我尝试通过注释从我的应用程序属性创建数据源@configurationProperties
//NOT WORKING
@Configuration(proxyBeanMethods = false)
public class DataSourcesConfiguration {
@Bean("dataSourceOne")
@Primary
@ConfigurationProperties(prefix="data1.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean("dataSourceTwo")
@ConfigurationProperties(prefix="data2.datasource")
public DataSource dataSourceTwo() {
return DataSourceBuilder.create().build();
}
}
如果
data1.datasource.url=jdbc:h2:mem:AAA-h2
data1.datasource.username=AAA
data1.datasource.password=AAA
data1.datasource.driverClassName=org.h2.Driver
data2.datasource.url=jdbc:oracle:thin:@AAA
data2.datasource.username=AAA
data2.datasource.password=AAA
data2.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
错误无法在非工作版本中检测数据库类型
。
如何通过我的application.properties
中的属性正确配置并通过我的属性提供数据源?
I'm working with Spring Boot/Spring Batch, and need to provide two jdbc Data Sources.
I can't find a way to automatically load the config parameters from my application.properties
.
//BatchConfiguration which uses both Data Sources:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
@Bean
public JdbcBatchItemWriter<Customer> writer(@Qualifier("dataSourceOne") DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<Customer>()
.itemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>())
.sql("..."))
.dataSource(dataSource)
.build();
}
@Bean
public JdbcCursorItemReader<Customer> reader(@Qualifier("dataSourceTwo") DataSource dataSource) {
return new JdbcCursorItemReaderBuilder<Customer>()
.dataSource(dataSource)
.name("myItemReader")
.sql("...")
.rowMapper(new CustomerRowMapper())
.build();
}
Above code works with the following Configuration, which has the DataSource provided directly:
//WORKING SOLUTION
@Configuration(proxyBeanMethods = false)
public class DataSourcesConfiguration {
@Bean("dataSourceOne")
@Primary
public DataSource dataSource() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url("jdbc:h2:mem:AAA-h2");
dataSourceBuilder.username("AAA");
dataSourceBuilder.password("AAA");
dataSourceBuilder.driverClassName("org.h2.Driver");
return dataSourceBuilder.build();
}
@Bean("dataSourceTwo")
public DataSource dataSourceTwo() {
DataSourceBuilder dataSourceBuilder = DataSourceBuilder.create();
dataSourceBuilder.url("jdbc:oracle:thin:@AAA");
dataSourceBuilder.username("AAA");
dataSourceBuilder.password("AAA");
dataSourceBuilder.driverClassName("oracle.jdbc.driver.OracleDriver");
return dataSourceBuilder.build();
}
}
Now if I try to create the DataSource from my application properties via annotation @ConfigurationProperties
, it will not work:
//NOT WORKING
@Configuration(proxyBeanMethods = false)
public class DataSourcesConfiguration {
@Bean("dataSourceOne")
@Primary
@ConfigurationProperties(prefix="data1.datasource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}
@Bean("dataSourceTwo")
@ConfigurationProperties(prefix="data2.datasource")
public DataSource dataSourceTwo() {
return DataSourceBuilder.create().build();
}
}
application.properties:
data1.datasource.url=jdbc:h2:mem:AAA-h2
data1.datasource.username=AAA
data1.datasource.password=AAA
data1.datasource.driverClassName=org.h2.Driver
data2.datasource.url=jdbc:oracle:thin:@AAA
data2.datasource.username=AAA
data2.datasource.password=AAA
data2.datasource.driverClassName=oracle.jdbc.driver.OracleDriver
I receive the error Unable to detect database type
in the non working version.
How can I correctly configure and provide a DataSource through my properties in application.properties
?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
创建
dataSource
用于创建的值实际上是其他类datasourceproperties
的一部分。您还可以使用它来创建
dataSource
。以下是来自 taskdbconfig (如果您需要更多功能,此类还包含信息)。
application.yml
The values to use in creating a
DataSource
are actually part of another classDataSourceProperties
which you can also use to create a
DataSource
.Following is a snippet from TaskDbConfig (this class also contains information if you need more functions).
application.yml