Spring Batch 不使用自定义数据源创建表
Posted
技术标签:
【中文标题】Spring Batch 不使用自定义数据源创建表【英文标题】:Spring Batch doesn't use custom datasource to create tables 【发布时间】:2017-09-25 02:19:54 【问题描述】:我正在开发 REST 服务(使用 Spring 启动),它运行批处理作业。我希望批处理只与 嵌入式数据源(用于存储元数据),而默认数据源(在我的例子中为 Postgres)将用于存储业务实体。
问题是 Batch 在启动时尝试在默认数据源中创建元数据表(如 batch_job_execution、batch_job_instance 等)。
这是重现问题的示例配置:
批量配置
@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer
@Override
@Autowired
public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource)
super.setDataSource(dataSource);
数据源配置
@Configuration
public class DataSourceConfiguration
@Bean
@Primary
public DataSource DataSource()
final SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
dataSource.setDriverClass(org.postgresql.Driver.class);
dataSource.setUrl("jdbc:postgresql://localhost:5432/test_batch");
dataSource.setUsername("user");
dataSource.setPassword("password");
return dataSource;
@Bean(name = "batchDataSource")
public DataSource batchDataSource()
return new EmbeddedDatabaseBuilder().setType(EmbeddedDatabaseType.H2).build();
使用此配置,我在微服务启动时在 Postgres 中获取批处理表,但之后似乎使用了嵌入式数据源,因为我在尝试时遇到 H2 的 "Table not found" 错误开始工作。
那么我应该如何正确编写配置以使 Batch 仅适用于嵌入式数据源?我不希望主数据源中有任何元数据(甚至是空表)。
更新:
正如 Michael Minella 所说,应该再添加一个 bean:
@Configuration
@EnableBatchProcessing
public class BatchConfiguration extends DefaultBatchConfigurer
@Override
@Autowired
public void setDataSource(@Qualifier("batchDataSource") DataSource dataSource)
super.setDataSource(dataSource);
@Bean
public BatchDatabaseInitializer batchDatabaseInitializer(@Qualifier("batchDataSource") DataSource dataSource, ResourceLoader resourceLoader)
BatchDatabaseInitializer batchDatabaseInitializer = new BatchDatabaseInitializer(dataSource, resourceLoader, new BatchProperties());
return batchDatabaseInitializer;
【问题讨论】:
您必须配置两个不同的数据源。在从您的属性/yml 中读取以“spring.datasource”为前缀的数据资源信息后,Spring Boot 将自动为您配置一个。此数据源将用于存储 Spring Batch 元表。您必须自己创建的第二个数据源可用作您的默认数据源 为什么你认为'spring.datasource'属性只会影响与批处理相关的数据源?你能举个例子吗? 【参考方案1】:不幸的是,使用 Spring Boot 时,BatchDataSourceInitializer
使用的 DataSource
与 BatchConfigurer
无关。它只是在上下文中获取默认的DataSource
。如果您自己配置BatchDataSourceInitializer
,则Boot 不会启动,您可以定义直接使用哪个DataSource
。
【讨论】:
顺便说一句,您能否解释一下为什么让配置扩展DefaultBatchConfigurer
类很重要?我尝试将配置器作为常规 bean,但在这种情况下它没有被使用。
它不需要扩展DefaultBatchConfigurer
,但如果你不需要,你需要完成BatchConfigurer
接口的实现,这可能是不必要的工作。
@MichaelMinella 如果我没有任何主数据源怎么办。就我而言,我得到了 3 个数据源,处理器和编写器访问了所有 3 个数据源。您有时间可以查看***.com/questions/67651106/…以上是关于Spring Batch 不使用自定义数据源创建表的主要内容,如果未能解决你的问题,请参考以下文章
Spring Batch Framework - 自动创建批处理表