spring-batch - Spring Batch - 创建两个数据源以及如何自定义使用其他属性
问题描述
我需要快速指导在 Spring Boot Batch 项目中创建两个关系数据源。一个是 Oracle 作为源数据库,另一个是 Postgres 目标数据库。Spring Boot V2.2.5.RELEADE
Spring Boot 版本 2.2.5.RELEASE
在这里,我想自定义两个数据源以使用此处提到的所有属性(http://shekup.blogspot.com/2018/05/multiple-data-sources-in-spring-batch.html#:~:text=Multiple%20Data %20sources%20in%20Spring%20batch,such%20as%20ETL%20batch%20job. ) 两个数据源
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres?currentSchema=XXXX?useSSL=false
spring.datasource.url=jdbc:postgresql://localhost:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=admin
spring.datasource.driver-class-name=org.postgresql.Driver
# max no. of connections in the pool
spring.datasource.hikari.maximum-pool-size=30
spring.datasource.hikari.minimum-idle=20
spring.datasource.hikari.connection-test-query=SELECT 1
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.default_schema=YYYY
spring.batch.initialize-schema=always
spring.batch.table-prefix=YYYY.BATCH_
### Source oracle DS ###
oracle.datasource.url=jdbc:oracle:thin:@//XXXX:1527/XXX
oracle.datasource.username=XXX
oracle.datasource.password=XXX
oracle.datasource.driverClassName=oracle.jdbc.Oracloracleiver
# max no. of connections in the pool
oracle.spring.datasource.hikari.maximum-pool-size=30
oracle.spring.datasource.hikari.minimum-idle=20
oracle.spring.datasource.hikari.connection-test-query=SELECT 1
数据库配置
@Configuration
public class DataSourceConfig {
@Autowired
private Environment env;
@Primary
@Bean(name = "postgresDataSource")
@ConfigurationProperties("spring.datasource")
public DataSource batchDataSource() {
return DataSourceBuilder.create().url(env.getProperty("spring.datasource.url"))
.driverClassName(env.getProperty("spring.datasource.driver-class-name"))
.username(env.getProperty("spring.datasource.username"))
.password(env.getProperty("spring.datasource.password")).build();
}
@Bean(name = "oracleDataSource")
@ConfigurationProperties("oracle.datasource")
public DataSource mysqlBatchDataSource() {
return DataSourceBuilder.create().url(env.getProperty("oracle.datasource.url"))
.driverClassName(env.getProperty("oracle.datasource.driver-class-name"))
.username(env.getProperty("oracle.datasource.username"))
.password(env.getProperty("oracle.datasource.password")).build();
}
}
解决方案
您必须通过自己的代码提供附加信息。不要使用 DataSourceBuilder。这是 Tomcat-Jdbc 和 Hikari 的示例
@Bean(name = "sourceBatchDataSource")
public DataSource sourceBatchDataSource() {
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setJdbcUrl(sourceDataSourceProperties.getUrl());
hikariDataSource.setUsername(sourceDataSourceProperties.getUsername());
hikariDataSource.setPassword(sourceDataSourceProperties.getPassword());
hikariDataSource.setDriverClassName(sourceDataSourceProperties.getDriverClassName());
hikariDataSource.setAutoCommit(from(environment.getProperty("spring.datasource.hikari.auto-commit")));
hikariDataSource.setConnectionTimeout(environment.getProperty("spring.datasource.hikari.connection-timeout", Integer.class));
hikariDataSource.setMaximumPoolSize(environment.getProperty("spring.datasource.hikari.maximum-pool-size", Integer.class));
hikariDataSource.setMaxLifetime(environment.getProperty("spring.datasource.hikari.max-lifetime", Integer.class));
hikariDataSource.setMinimumIdle(environment.getProperty("spring.datasource.hikari.minimum-idle", Integer.class));
hikariDataSource.setPoolName("SourceBatchHikariCP");
return hikariDataSource;
}
@Primary
@Bean(destroyMethod = "close", name = "sourceDataSource")
public DataSource sourceDataSource() {
DataSourceProperties dataSourceProperties = dataSourceProperties();
PoolProperties properties = new PoolProperties();
properties.setUrl(dataSourceProperties.getUrl());
properties.setDriverClassName(dataSourceProperties.getDriverClassName());
properties.setUsername(dataSourceProperties.getUsername());
properties.setPassword(dataSourceProperties.getPassword());
properties.setInitialSize(environment.getProperty("spring.datasource.tomcat.initial-size", Integer.class));
properties.setMaxWait(environment.getProperty("spring.datasource.tomcat.max-wait", Integer.class));
properties.setMaxActive(environment.getProperty("spring.datasource.tomcat.max-active", Integer.class));
properties.setMaxIdle(environment.getProperty("spring.datasource.tomcat.max-idle", Integer.class));
properties.setMinIdle(environment.getProperty("spring.datasource.tomcat.min-idle", Integer.class));
properties.setDefaultAutoCommit(from(environment.getProperty("spring.datasource.tomcat.default-auto-commit")));
properties.setValidationQuery(environment.getProperty("spring.datasource.tomcat.validation-query"));
properties.setTestOnBorrow(from(environment.getProperty("spring.datasource.tomcat.test-on-borrow")));
properties.setTestWhileIdle(from(environment.getProperty("spring.datasource.tomcat.test-while-idle")));
properties.setTestOnReturn(from(environment.getProperty("spring.datasource.tomcat.test-on-return")));
properties.setTimeBetweenEvictionRunsMillis(environment.getProperty("spring.datasource.tomcat.time-between-eviction-runs-millis", Integer.class));
properties.setMinEvictableIdleTimeMillis(environment.getProperty("spring.datasource.tomcat.min-evictable-idle-time-millis", Integer.class));
properties.setRemoveAbandoned(from(environment.getProperty("spring.datasource.tomcat.remove-abandoned")));
properties.setRemoveAbandonedTimeout(environment.getProperty("spring.datasource.tomcat.remove-abandoned-timeout", Integer.class));
properties.setLogAbandoned(from(environment.getProperty("spring.datasource.tomcat.log-abandoned")));
properties.setLogValidationErrors(from(environment.getProperty("spring.datasource.tomcat.log-validation-errors")));
properties.setJdbcInterceptors(environment.getProperty("spring.datasource.tomcat.jdbc-interceptors"));
return new org.apache.tomcat.jdbc.pool.DataSource(properties);
}
推荐阅读
- angular - 如何使用角度的动态数据在高图表中钻取?
- python - 如何检查变量是否是联合中一种类型的实例?
- python - docker容器内的SSH密钥
- vue.js - 在 Vue 中处理选项选择表单中的数据
- ruby-on-rails - 如何过滤多个记录并仅从 postgres ltree 结构中获取最外层的记录?
- azure - 使用 ARM 模板为 Azure VM 诊断日志禁用 Azure 诊断代理
- r - 根据 R 中的 date1 (行)和 date2 (列)创建一个支付总和的矩阵
- python - 如何调用没有参数的函数?
- spring-boot - org.springframework.beans.factory.BeanCreationException:创建类路径资源中定义的名称为“defaultValidator”的bean时出错
- android - 将数据从小部件传递给活动